2014-02-15 46 views
5

我試圖在數據庫中插入字節數組的字節。使用下面的代碼。如何在使用C#的查詢中傳遞字節數組?

String query = String.Format(@"INSERT INTO [Documents] 
           ([InsertedBy], [DocumentName], [Document]) 
           VALUES 
           ('{0}','{1}',{2})", 
           insertedBy, docName, docBytes); 

Cmd.CommandText = query; 
Cmd.ExecuteNonQuery(); 

以下異常發生:

對象或列名不存在或爲空。對於SELECT INTO 語句,請確認每列都有一個名稱。對於其他語句,請查看 以獲取空白別名。別名定義爲「」或[]是不允許的。 將別名更改爲有效的名稱。 ''附近語法不正確。

我不明白是什麼原因。

+2

什麼類型的這些列? 「insertedBy」,「docName」和「docBytes」的值是什麼? –

+0

insertedBy是int,documentname是varchar(100),Document是VarBinary(max) – AndroidLearner

+2

我總是以這種方式插入varbinary作爲參數:http://stackoverflow.com/a/1088630/812598,因爲它似乎根據它的名稱是一個原始的'byte []'類型。 – GoRoS

回答

1

切勿使用字符串連接或字符串函數來進行參數化查詢。

另外,因爲(我懷疑)docBytes是一個byte[],字符串連接將不會有您希望的結果。

這裏是我會怎麼做:

private static void InsertDocument(SqlCommand cmd, int insertedBy, string docName, byte[] docBytes) 
{ 
    cmd.CommandText = @"INSERT INTO [Documents] 
         ([InsertedBy], [DocumentName], [Document]) 
         VALUES 
         (@insertedBy,@docName,@docBytes)"; 
    cmd.Parameters.Add("insertedBy", SqlDbType.Int).Value = insertedBy; 
    // Note: consider using `nvarchar` instead of `varchar`; 
    cmd.Parameters.Add("docName", SqlDbType.VarChar, 100).Value = docName; 
    // Note: -1 maps to the nvarchar(max) length; 
    cmd.Parameters.Add("docBytes", SqlDbType.VarBinary, -1).Value = docBytes; 

    // The following call presupposes that the associated `SqlConnection` is open 
    cmd.ExecuteNonQuery(); 
} 
0

如果您的insertedBy列是int,則不需要使用單引號。因爲您嘗試將字符插入到您的int鍵入列中。

只要使用它就好;

string query = String.Format(@"INSERT INTO [Documents] 
           ([InsertedBy], [DocumentName], [Document]) 
           VALUES 
           ({0},'{1}',{2})", 
           insertedBy, docName, docBytes); 

但是既然我們不知道你的價值觀,這是我唯一的建議。

+0

我不是專家,但我會假設'docBytes'也可能是一個問題,例如,如果它是'byte []'。問題中的錯誤信息可能表明類似的情況。 – Dirk

+0

@Dirk可能..但是因爲我們不知道它們究竟是什麼,所以我們永遠不知道.. –

+0

即使刪除引號後也會出現同樣的錯誤,這是肯定的,這些引用不是引起問題的原因 – AndroidLearner

相關問題