【问题标题】:How to use the SqlParameter.Offset property and ADO.NET to store a binary file in SQL Server 2012如何使用 SqlParameter.Offset 属性和 ADO.NET 在 SQL Server 2012 中存储二进制文件
【发布时间】: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


【解决方案1】:

Offset 属性用于二进制和字符串数据的客户端分块。

例如,为了在服务器上的一列中插入 10MB 的文本,用户可能会执行 10 次参数化的 1MB 块插入,在每次迭代中将 Offset 的值移动 1MB。

Offset 指定二进制类型的字节数和字符串的字符数。字符串计数不包括终止字符。

//Simple Use offset
parameter.Offset = 3;

【讨论】:

  • ADO.NET 中没有终止字符的概念。您似乎来自 C 背景。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多