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

C# 插入大于8k字节的字节数组,c#,sql,sql-server,varbinary,C#,Sql,Sql Server,Varbinary,我在用密码 cmd.Parameters.Add("@Array", SqlDbType.VarBinary).Value = Array; SqlDbType.VarBinary描述指出,它只能处理数组的最大8K字节。我有一个字节数组,它代表一个图像,可以达到10k字节 如何使用C#将其存储在varbinary(max)列中 创建阵列没有问题。在尝试执行查询时,我被这个8k限制卡住了 编辑:让我澄清一下,在我的机器上,当我在本地运行asp.net应用程序时,甚至高达15k字节的图片也会存储在

我在用密码

cmd.Parameters.Add("@Array", SqlDbType.VarBinary).Value = Array;
SqlDbType.VarBinary描述指出,它只能处理数组的最大8K字节。我有一个字节数组,它代表一个图像,可以达到10k字节

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

创建阵列没有问题。在尝试执行查询时,我被这个8k限制卡住了


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

不,这是描述中实际说的:

字节类型的数组。二进制数据的可变长度流 在1到8000字节之间。如果字节数组无效,隐式转换将失败 大于8000字节工作时显式设置对象 字节数组大于8000字节。

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

command.Parameters.Add("@MyColumn", SqlDbType.VarBinary).Value = myByteArray;
与此相反:

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

也许你可以看看这个功能,因为它是用来存储文件的。它基本上存储一个指向文件的指针,文件直接存储在文件系统中(数据库数据目录中)

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

谷歌很快放弃了在c#中使用filestream,但我相信还有很多其他的

操作编辑后更新

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



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

添加数据长度似乎是解决办法

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

为什么不将映像存储在硬盘中,并将路径保存在db中?哪个版本的SQL Server?有一些变化。(此外,如果您遇到错误,请确保包含准确的消息-这也会使其他人更容易找到问题,甚至可能会找到重复的问题。)甚至对“如何”为VARBINARY(MAX)列执行此操作似乎没有提及。但是(先创建参数对象,然后添加它,没有提及8k大小限制)。。您确定最初显示的代码不起作用吗?如果没有,请发布错误/异常。我无法存储路径,因为我将从客户端计算机接收图像,然后将其保存在服务器计算机上。其次,当我使用大于8KB的图像时,图像不会存储在我的数据库中。(我使用WCF通过silverlight将图像传输到我的服务器,该过程完成时没有任何问题。)“使用此”是OP使用的。虽然FILESTREAM是一种方便的新类型,但我不确定它是否适合在这里使用(2008年才引入)。OP表示,最大数据量约为10k,这不是使用FS所擅长的。(FS类型基本上提供了一个比“手动存储文件名和读取文件”更好的层。)是的,我错过了10k限制,我读了“我存储图像”。。。我过去使用这种方法的方式是,如果小于限制,则在db中使用混合存储,如果大于限制,则使用filestream…我感兴趣的是:1。为什么ADO.NET中有VARBINARY(MAX)限制(如果有,是什么限制),或者2。如果没有,为什么OP认为/报告他/她的程序有这样的限制。@user2864740在尝试不同大小(甚至大于1.5MB)的图像时,它对我有什么价值?所以现在整个问题/前提都是可疑的。那些是最好的>_
var dataParam = cmd.Parameters.AddWithValue("@Data", (object)data.Data ?? DBNull.Value);
                if (data.Data != null)
                {
                    dataParam.SqlDbType = SqlDbType.VarBinary;
                    dataParam.Size = data.Data.Length;
                }