加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:26:26 所属栏目:MsSql教程 来源:网络整理
导读:参见英文答案 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派生的类型插入或更新到该列吗?怎么样? 我认为我可以使用SqlData
参见英文答案 > 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.NET到SqlFileStream课程的“真正”流媒体.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读