我可以使用流来插入或更新SQL Server(C#)中的行吗?

前端之家收集整理的这篇文章主要介绍了我可以使用流来插入或更新SQL Server(C#)中的行吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > 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派生的类型插入或更新到该列吗?怎么样?

我认为我可以使用sqlDataReader从这样的列获取只读流,在读取器上调用GetSqlBytes(),获取sqlBytes实例,然后在其上引用Stream属性.

我想要的是反过来 – 我想要一个流更新或插入.

可能? (来自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.NETSqlFileStream课程的“真正”流媒体.

如果您不能使用FILESTREAM存储,那么我担心您将不得不在某个时间点处理内存中的数据,这几乎就是ADO.NET的工作方式.

原文链接:https://www.f2er.com/mssql/83473.html

猜你在找的MsSQL相关文章