Che*_*eso 5 .net c# sql-server stream
假设我有一个VarBinary [MAX]列,我可以使用从System.IO.Stream派生的类型插入或更新到该列吗?怎么样?
我认为我可以得到一个只读从这样的柱,使用流SqlDataReader,调用GetSqlBytes()的读者,获得SqlBytes实例,然后引用该流的该属性.
我想要的是反过来 - 我想要一个流更新或插入.
可能?(来自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;
Run Code Online (Sandbox Code Playgroud)
...但我不想使用数组来指定值.这适用于小数据大小,但不会随着大小变大.我想写成一个流.
您应该能够将一个实例SqlBytes作为参数传递给需要的SqlCommand地方varbinary.同一个SqlBytes类有一个包装a 的构造函数重载Stream.因此,只需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);
Run Code Online (Sandbox Code Playgroud)
用这个:
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);
Run Code Online (Sandbox Code Playgroud)
当然,不要忘记在执行命令后处理MemoryStream所有这些其他IDisposable实例.
编辑:好的,我刚刚看到你的编辑的底部,这暗示数据非常大,你不希望它最终在内存中,这实际上不会解决这个问题.事实上,如果价值很大,那么首先将它存储在一个varbinary列中是个坏主意.
如果您使用的是SQL Server 2008,则可以(并且应该!)使用FILESTREAM.这实际上不支持"真正的"流ADO.NET通过SqlFileStream类.
如果您不能使用FILESTREAM存储,那么我担心您将不得不在某个时间点处理内存中的数据,这几乎就是ADO.NET的工作方式.
| 归档时间: |
|
| 查看次数: |
9491 次 |
| 最近记录: |