2015-05-04 49 views
0

我想通過使用存儲過程來存儲二進制數據。存儲過程有三個參數。最後一個參數將包含二進制數據。但是,當我運行代碼它給SQL異常如何處理SQL異常必須傳遞參數編號'x'?

必須通過參數號3和後續的參數爲「@name = 值」。在使用'@name = value'形式後,所有後續的 參數必須以'@name = value'的形式傳遞。

SqlCommand cmd = new SqlCommand("EXEC myProc @param1 = 8, @param2= '5.png', @FileSignature"); 
using (SqlConnection conn = new SqlConnection(myConnString)) 
{ 
    cmd.Connection = conn; 

    if (FileSignature == null) //FileSignature is byte[] 
    { 
     cmd.Parameters.Add("@FileSignature", SqlDbType.VarBinary, -1); 
     cmd.Parameters["@FileSignature"].Value = System.DBNull.Value; 
    } 
    else 
     cmd.Parameters.AddWithValue("@FileSignature", FileSignature); //FileSignature is byte[] 
     int iReturn = cmd.ExecuteNonQuery(); 
    } 
+0

使用相同的方法傳遞所有參數。不要將前兩個作爲一對放入SQL命令文本中,然後將第三個添加到集合中。 –

回答

1

不能使用他人@param=val一些參數和@param。 此外,這是不使用sqlCommand來執行存儲過程的正確方法。
請嘗試讀取異常消息。這是平原e英語,並有幫助。
試試這個:

using(SqlConnection conn = new SqlConnection(myConnString), 
     SqlCommand cmd = new SqlCommand("myProc", conn) 
{ 
    cmd.CommandType = SqlCommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("@param1", 8); 
    cmd.Parameters.AddWithValue("@param2", '5.png'); 

    if (FileSignature == null) //FileSignature is byte[] 
    { 
     cmd.Parameters.Add("@FileSignature", SqlDbType.VarBinary, -1); 
     cmd.Parameters["@FileSignature"].Value = System.DBNull.Value; 
    } 
    else 
    { 
     cmd.Parameters.AddWithValue("@FileSignature", FileSignature); //FileSignature is byte[] 
    } 
    conn.Open(); 
    int iReturn = cmd.ExecuteNonQuery(); 
    conn.Close(); 
} 
1

因爲你的名字提供的前兩個參數必須爲所有三個這樣做。所以,你需要更新你的SqlCommand文本,包括它SqlCommand cmd = new SqlCommand("EXEC myProc @param1 = 8, @param2= '5.png', **@Parameter3** = @FileSignature");

替換@參數3從您的存儲過程或名稱可選的,你可能只是不傳遞任何名稱(只要參數是在你的程序中相同的順序。

SqlCommand cmd = new SqlCommand("EXEC myProc 8, '5.png', @FileSignature");