簡體   English   中英

插入大於8k字節的字節數組

[英]Inserting a byte array larger than 8k bytes

我正在使用代碼

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

SqlDbType.VarBinary描述指出它只能處理數組的最大8 K字節。 我有一個代表圖像的字節數組,最多可以增加10k字節。

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

我毫不費力地創建數組。 嘗試執行查詢時,我被限制在8k的限制內。

編輯:讓我澄清一下,當我在本地運行asp.net應用程序時,即使是高達15k字節的圖片也被存儲在varbinary(MAX)列中的數據庫中,但是一旦部署它,圖片就不會被存儲。 然后,我采取了大幅調整圖像大小的方法,以確保它們的大小小於8K,現在可以毫無問題地存儲圖像。

也許您可以看看Sql Server FILESTREAM功能,因為它旨在存儲文件。 它基本上存儲指向您文件的指針,並且該文件直接存儲在文件系統中(在數據庫數據目錄中)。

我喜歡FILESTREAM,因為它意味着您繼續使用數據庫的接口(例如SQLClient),而不是使用臨時方法來將文件讀/寫到硬盤驅動器。 這意味着可以為您管理安全性,因為您的應用無需特殊權限即可訪問文件系統。

快速谷歌給了這篇文章關於在c#中使用文件流的信息,但是我敢肯定還有很多其他的東西。

OP EDIT之后的更新

那么,一旦部署到其他服務器,上傳會失敗嗎? 也許問題不在於sql插入,而是強加了http請求內容的長度限制-例如,在您的web.config中, httpRuntime元素具有maxRequestLength屬性。 如果將其設置為較低的值,則可能是問題所在。 因此,您可以將其設置為以下內容(在10kb的問題上,最大設置為6MB):

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

這里唯一的限制是它默認購買4MB的限制:|

不,這就是描述中實際所說的:

字節類型的數組。 長度可變的二進制數據流,范圍在1到8,000個字節之間。 如果字節數組大於8,000個字節,則隱式轉換將失敗。 使用大於8,000個字節的字節數組 時,顯式設置對象

我認為這實際上意味着如果字節數組超過8000個元素,則不能使用AddWithValue來讓參數將類型推斷為VarBinary。 您將必須使用添加,自己指定參數的類型,然后設置Value屬性,即使用以下方法:

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

而不是這樣:

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

解決方法是增加數據長度

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM