【发布时间】:2014-07-06 12:37:55
【问题描述】:
我目前正在学习如何在不使用 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:偏移量和长度超出了数组的范围,或者计数大于从索引到源集合末尾的元素数。
【问题讨论】:
-
可能是因为它只是 commandParameter.Offset = 0。为了清楚起见,您提到了 VarChar(max),但根据您的代码,我预计 VarBinary(max)?因此,给定大小为 1M 的块 Offset 将以 1M 的间隔增加。从来没有试过这个,我感谢你提出这个问题,因为我学到了一些新东西。
-
你是对的,我会编辑它。它是 VarBinary(max)。偏移量默认为 0。感谢您的评论。
-
所以你现在可以自己回答这个问题了。在我看来值得做。当然你不想ReadAllBytes,你想读取一个1M的文件块。
-
啊...第一个查询是插入,随后的查询将被更新。因此您插入第一个 meg 并更新以下 9 的记录。尽管它应该以任何顺序工作
-
根据您的编辑和意图 commandParameter.size 应该是 1M 并且您应该为二进制数据文件参数获得 1M 的文件
标签: c# ado.net sql-server-2012 offset sqlparameter