参见英文答案 >
How to I serialize a large graph of .NET object into a SQL Server BLOB without creating a large buffer?7个
假设我有一个VarBinary [MAX]列,我可以使用从System.IO.Stream派生的类型插入或更新到该列吗?怎么样?
假设我有一个VarBinary [MAX]列,我可以使用从System.IO.Stream派生的类型插入或更新到该列吗?怎么样?
我认为我可以使用sqlDataReader从这样的列获取只读流,在读取器上调用GetSqlBytes(),获取sqlBytes实例,然后在其上引用@L_404_2@属性.
我想要的是反过来 – 我想要一个流更新或插入.
可能? (来自c#…没有编写T-sql?)
编辑
我见过这样的代码:
System.Data.sqlClient.sqlCommand _sqlCommand = new System.Data.sqlClient.sqlCommand(_sql,_sqlConnection); // Convert image to memory stream System.IO.MemoryStream _MemoryStream = new System.IO.MemoryStream(); _Image.Save(_MemoryStream,_ImageFormat); // Add image as sql parameter System.Data.sqlClient.sqlParameter _sqlParameter = new System.Data.sqlClient.sqlParameter("@" + _ImageFieldName,sqlDbType.Image); _sqlParameter.Value = _MemoryStream.ToArray(); _sqlCommand.Parameters.Add(_sqlParameter); // Executes a Transact-sql statement against the connection // and returns the number of rows affected. _sqlRetVal = _sqlCommand.ExecuteNonQuery(); // Dispose command _sqlCommand.Dispose(); _sqlCommand = null;
…但我不想使用数组来指定值.这适用于小数据大小,但不会随着大小变大.我想写成一个流.
解决方法
无论何处需要varbinary,您都应该能够将sqlBytes的实例作为参数传递给sqlCommand.同一个sqlBytes类有一个包装Stream的
constructor overload.因此,只需从流中创建一个sqlBytes实例,然后将其作为参数值传递.
换句话说,将其纳入修订后的代码中,而不是:
MemoryStream _MemoryStream = new System.IO.MemoryStream(); _Image.Save(_MemoryStream,_ImageFormat); sqlParameter _sqlParameter = new sqlParameter("@" + _ImageFieldName,sqlDbType.Image); _sqlParameter.Value = _MemoryStream.ToArray(); _sqlCommand.Parameters.Add(_sqlParameter);
用这个:
MemoryStream _MemoryStream = new System.IO.MemoryStream(); _Image.Save(_MemoryStream,_ImageFormat); _MemoryStream.Position = 0; // I *think* you need this sqlParameter _sqlParameter = new sqlParameter("@" + _ImageFieldName,sqlDbType.VarBinary); _sqlParameter.Value = new sqlBytes(_MemoryStream); _sqlCommand.Parameters.Add(_sqlParameter);
当然,不要忘记在执行命令后释放MemoryStream和所有其他IDisposable实例.
编辑:好的,我刚看到你的编辑的底部,这暗示数据非常大,你不希望它最终在内存中,这实际上不会解决这个问题.事实是,如果值很大,那么首先将它存储在varbinary列中是个坏主意.
如果您使用的是sql Server 2008,则可以(并且应该!)使用FILESTREAM.这实际上支持ADO.NET到SqlFileStream课程的“真正”流媒体.
如果您不能使用FILESTREAM存储,那么我担心您将不得不在某个时间点处理内存中的数据,这几乎就是ADO.NET的工作方式.