我目前正在学习如何在SQL Server中不使用varchar(max)上的FILESTREAM属性来存储文件,因为我不需要存储非常大的二进制文件.尽管我想通过它的小块存储二进制数据.我发现的是SqlParameter.Offset属性.以下是来自MSDN的一些信息:
"Offset属性用于二进制和字符串数据的客户端分块.例如,为了将10MB的文本插入服务器上的列,用户可能会执行10个参数化的1MB块插入,移动Offset的值每次迭代1MB."
听起来这正是我所需要的,但我对如何使用它感到困惑.我创建了一个非常简单的表,名为BinaryFilesTable(Id,FileData).Id是主键,FileData是varbinary(max).到目前为止,这是我的代码.
public static void Main(string[] args) { var fileBytes = File.ReadAllBytes("../../image.jpg"); const string connectionString = @"Server=.; Database=TestDb; Integrated Security=true"; SqlConnection connection = new SqlConnection(connectionString); connection.Open(); using (connection) { string commandText = "INSERT INTO BinaryFilesTable(FileData) VALUES (@binaryFileData)"; SqlCommand command = new SqlCommand(commandText, connection); SqlParameter commandParameter = new SqlParameter(); commandParameter.ParameterName = "@binaryFileData"; commandParameter.Value = fileBytes; commandParameter.SqlDbType = SqlDbType.VarBinary; commandParameter.Size = -1; // VarBinary becomes VarBinary(max) if size is set to -1. //commandParameter.Offset = ??? How to use it ??? command.Parameters.Add(commandParameter); command.ExecuteNonQuery(); } }
使用此代码我设法将数据存储在表中,但我不确定它是如何工作的.据我了解,目前二进制数据一次性存储,这就是我想弄清楚如何使用这个Offset属性的原因.我花了几个小时寻找一个教程但没有成功.
编辑:如果我设置一些值到偏移量我得到以下异常:
System.ArgumentException:偏移量和长度超出数组的范围,或者计数大于从索引到源集合末尾的元素数.