插入大于8k字节的字节数组

时间:2014-03-01 06:35:17

标签: c# sql sql-server varbinary

我正在使用代码

cmd.Parameters.Add("@Array", SqlDbType.VarBinary).Value = Array;

SqlDbType.VarBinary描述表明它只能处理最多8 K字节的数组。我有一个表示图像的字节数组,可以达到10k字节。

如何使用C#将其保存在varbinary(max)列中?

我创建数组没有问题。在尝试执行查询时,我遇到了这个8k的限制。

编辑:让我澄清一下,在我的机器上,当我在本地运行asp.net应用程序时,甚至多达15k字节的图片都存储在varbinary(MAX)列中的数据库上,但是一旦我部署它就不会存储图片。然后我采取了大幅度调整图像大小以确保它们的大小小于8K,现在图像存储没有任何问题。

3 个答案:

答案 0 :(得分:0)

也许您可以查看Sql Server FILESTREAM功能,因为它用于存储文件。它基本上存储了一个指向文件的指针,文件直接存储在文件系统中(在数据库数据目录中)。

我喜欢FILESTREAM,因为它意味着你继续使用数据库接口(例如SQLClient),而不是使用adhoc方法读取/写入硬盘驱动器的文件。这意味着为您管理安全性,因为您的应用程序不需要特殊权限来访问文件系统。

快速谷歌给了this acticle在c#中使用文件流,但我确信还有很多其他人。

OP EDIT后更新

因此,一旦部署到其他服务器上传失败了?也许问题不是sql插件,而是强加了http请求内容长度限制 - 例如在web.config中 httpRuntime 元素具有 maxRequestLength 属性。如果将其设置为较低值,则可能是问题所在。所以你可以设置这样的东西(最大设置为6MB,远远超过10kb的问题):

<system.web>
    <httpRuntime maxRequestLength="6144" />

这里唯一的限制是4MB购买默认值:|

答案 1 :(得分:-1)

不,这就是描述的实际内容:

  

Byte类型的数组。可变长度的二进制数据流范围   介于1到8,000之间。如果是字节数组,则隐式转换失败   大于8,000个字节。 工作时明确设置对象    字节数组大于8,000字节。

我认为实际上意味着,如果字节数组超过8000个元素,则不能使用AddWithValue将参数推断为VarBinary类型。您必须使用Add,自己指定参数的类型,然后设置Value属性,即使用:

command.Parameters.Add("@MyColumn", SqlDbType.VarBinary).Value = myByteArray;

而不是:

command.Parameters.AddWithValue("@MyColumn", myByteArray);

答案 2 :(得分:-1)

添加数据长度似乎是修复

var dataParam = cmd.Parameters.AddWithValue("@Data", (object)data.Data ?? DBNull.Value);
                if (data.Data != null)
                {
                    dataParam.SqlDbType = SqlDbType.VarBinary;
                    dataParam.Size = data.Data.Length;
                }