2011-07-05 108 views
5

我试图挽救FileUpload控件图像到数据库大小限制超过

public Byte[] bytes; 
Stream fs = FileUpload1.PostedFile.InputStream; 
BinaryReader br = new BinaryReader(fs); 
bytes = br.ReadBytes((Int32)fs.Length); 
SqlDataSource2.Update(); 

protected void SqlDataSource2_Updating(object sender, SqlDataSourceCommandEventArgs e) 
{ 
    e.Command.Parameters["@project_file"].Value = bytes; 
} 

我的数据库project_file字段设置为varbinary(MAX)

但它抛出一个错误

参数'@project_file'超出sql_variant数据类型的大小限制。

请提出一些解决方案

+0

你缩进代码的方式是......创意。 ;-) – Heinzi

回答

7

这是从MSDN on binary and varbinary报价:

可变长度的二进制数据。 n可以是 从1到8,000的值。最大 表示最大存储量 大小为2^31-1字节。存储大小 是输入的数据的实际长度 + 2个字节。输入的数据是 可以是0字节。varbinary的ANSI SQL同义词是 二元变化。

varbinary(MAX)可以容纳大小为〜2GB的图像。

解决问题的方法:

你忘了指定在你的代码的类型。您需要设置正确的SqlDbType

e.Command.Parameters["@project_file"].SqlDbType = SqlDbType.VarBinary

,你也应该做我设置正确Size

+0

感谢这么好的解释filip.have一个愉快的一天 –

+0

如果羽绒服的选民可以请留下评论,如果我说的是错误的,这将是很多apprechiated。 –

+0

这对我有效:((SqlParameter)e.Command.Parameters [“@ FileData”])。SqlDbType = SqlDbType.VarBinary; – samir105

1

问题是,sql server将参数的类型分配为“SQL_Variant”。

尝试assing DbType会将:

e.Command.Parameters["@project_file"].SqlDbType = SqlDbType.Image 
e.Command.Parameters["@project_file"].Value = bytes; 
+0

它解决了我的问题,谢谢。但我没有得到这个概念。为什么设置数据库中的类型后,我们必须再次设置数据库类型? –

+1

@saurabh,您的代码不知道您发送到数据库的数据类型。所以它会做什么是推广到sql_variant和数据库期望二进制数据(varbinary/blob/image)。 –

+0

@saurabh:Filip答案正是你的代码所发生的。 – 2GDev

0

不要使用SQL_VARIANT在你的C#程序的数据类型。使用以下类型来代替:

Dim binaryStream As SqlBinary 

http://msdn.microsoft.com/en-us/library/a1904w6t(VS.80).aspx

附:当你使用Image和Blob的数据类型时,你会杀死一只小猫。这些数据类型已被弃用,并且不会再存储varbinary(MAX)。关于使用图像的VS VARBINARY(最大)

边注:

图像从0到2^31-1(2,147,483,647)字节 可变长度的二进制数据。

varbinary [(n | max)](最大存储大小为2^31-1字节。) 可变长度二进制数据。 n可以是从1到8,000的值。max表示最大存储大小为2^31-1字节。存储大小是输入数据的实际长度+ 2个字节。输入的数据可以是0字节。 varbinary的ANSI SQL同义词是二元变化的。

+1

你从哪里读到'Image'和'Blog'已被弃用? –

+0

http://msdn.microsoft.com/en-us/library/ms187993.aspx和http://msdn.microsoft.com/en-us/library/ms188362.aspx – JStead

+0

看看ntext,文本和图片说重要 – JStead

相关问题