如何使用SqlParameter.偏移属性和ADO.. NET在SQL Server 2012中存储二进制文件

本文关键字:Server SQL 2012 二进制文件 存储 NET ADO SqlParameter 何使用 属性 | 更新日期: 2023-09-27 18:03:49

我目前正在学习如何在SQL Server中不使用varchar(max)上的FILESTREAM属性存储文件,因为我不需要存储非常大的二进制文件。尽管如此,我还是想用小块来存储二进制数据。我找到的是SqlParameter。抵消房地产。以下是来自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();
        }
    }

使用此代码,我设法将数据存储在表中,但我不完全确定它是如何工作的。正如我所理解的,目前二进制数据是一次性存储的,这就是我想弄清楚如何使用这个偏移属性的原因。我花了几个小时寻找教程,但没有成功。

编辑:如果我为偏移量设置了一些值,我会得到以下异常:

系统。ArgumentException:偏移量和长度超出数组的范围,或者计数大于从索引到源集合结束的元素数量。

如何使用SqlParameter.偏移属性和ADO.. NET在SQL Server 2012中存储二进制文件

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

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

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

//Simple Use offset
parameter.Offset = 3;