2011-07-05 61 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