0

我有一個ASP.NET MVC網站與管理頁面,我需要合併兩個記錄。我輸入了兩個值:@old@new。將這些添加到我的SqlCommand對象後,我將其稱爲ExecuteNonQuery()。這是生成與消息說異常SQL Server無法識別我的參數

存儲過程「FixDuplicate」希望這是 不提供

正如你可以看到下面的參數「@old」,我肯定添加參數。我試過的所有3個版本都在那裏。

這段代碼有什麼問題?

版本1:(請忽略這一塊的語法,我已經刪除了此代碼,但我沒有嘗試,並證實該參數存在,當它達到ExecuteNonQuery()調用)

var sql = "FixDuplicate"; 

comm.Parameters.Add(new System.Data.SqlClient.SqlParameter("@old", model.Duplicate)); 
comm.Parameters.Add(new System.Data.SqlClient.SqlParameter("@new", model.Primary)); 

_dataAccessService.ExecuteSql(conn, comm); 

版本2:

comm.Parameters.AddWithValue("@old", model.Duplicate); 
comm.Parameters.AddWithValue("@new", model.Primary); 

版本3:

comm.Parameters.Add("@old", System.Data.SqlDbType.Int); 
comm.Parameters[0].Value = model.Duplicate; 
comm.Parameters.Add("@new", System.Data.SqlDbType.Int); 
comm.Parameters[1].Value = model.Primary; 

最後,這裏是在_dataAccessService.ExecuteSql(conn, comm)調用的代碼:

public void ExecuteSql(SqlConnection connection, SqlCommand command, bool closeConnection = true) 
{ 
    if (connection == null) 
     throw new ArgumentNullException("connection"); 

    if (command == null) 
     throw new ArgumentNullException("command"); 

    try 
    { 
     if (connection.State != ConnectionState.Open) 
      connection.Open(); 

     try 
     { 
      command.ExecuteNonQuery(); 
     } 
     catch 
     { 
      throw; 
     } 
     finally 
     { 
      if (closeConnection) 
       command.Dispose(); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("Sorry, an error occurred ExecuteSql: " + ex.Message, ex); 
    } 
    finally 
    { 
     if (closeConnection) 
      connection.Dispose(); 
    } 
} 

注:我已經證實,兩個「@old」和「@new」值設置當它到達ExecuteNonQuery()一行。

編輯:下面是完整的代碼,因爲它的存在:

// Here we need to execute the "FixDuplicate" stored procedure 
var sql = "FixDuplicate"; 
var conn = _dataAccessService.GetConnection(""); 
var comm = _dataAccessService.GetCommand(conn, sql, System.Data.CommandType.StoredProcedure); 

//comm.Parameters.AddWithValue("@old", model.DuplicateWrestler); 
//comm.Parameters.AddWithValue("@new", model.PrimaryWrestler); 
comm.Parameters.Add("@old", System.Data.SqlDbType.Int); 
comm.Parameters[0].Value = model.DuplicateWrestler; 
comm.Parameters.Add("@new", System.Data.SqlDbType.Int); 
comm.Parameters[1].Value = model.PrimaryWrestler; 

_dataAccessService.ExecuteSql(conn, comm); 
+0

你有沒有想過創建一個自己的幫助類或自定義類,它傳遞參數並將它們添加到foreach循環中我會發佈一個你可以做的例子 – MethodMan

+0

你確定model.Duplicate不是空值? – Salim

+0

@Salim是的,我添加了一個「註釋」的問題... – ganders

回答

0

可能是你model.Duplicatenull。在這種情況下,參數的值將不會被設置爲

如果您需要將null更改爲SqlParameter.Value,請使用DBNull.Value

請參閱SqlParameter.Value以供參考。

+0

不,每次我設置我的斷點時,我確認'@old'和'@new'已填充,並設置爲正確的值。 – ganders

+0

只是爲了證實這一點(現在我在工作,而不是坐在我的代碼前面)。我剛剛進行了一次檢查,以確保兩個值都大於0.一旦我的雲提供商構建並部署,我將再次運行並確保... – ganders

+0

我添加了一個檢查以查看model.Primary> 0和model。重複> 0並且它沒有返回驗證錯誤。 – ganders

0

我相信你需要指定一個命令類型:

command.CommandType = CommandType.StoredProcedure; 
+0

對不起,這已經在那裏,我刪除了,我認爲是不必要的代碼行。我將使用正在生產的完整版本進行更新... – ganders

0

我建議你使用Profiler來檢查,如果舊的參數設置與否。 也嘗試從SQL Server Management Studio運行此過程以確保其正常工作。

+0

我一直在直接從SSMS運行存儲過程幾個月,現在我只是試圖將它添加到應用程序中,因爲我無法在工作中使用SSMS(他們阻止訪問Sql雲提供商)。 Profiler上的好主意,這將確認它可能[不]存在。當我回家時,我必須嘗試。 – ganders