2011-07-24 129 views
0

我試圖通過使用AddWithValue()對象值的參數名稱和對象[]的Array []的元素循環。 不幸的是,它說「過程或函數'sp_add_Request'期望參數'@RequestType',它沒有被提供」。當我運行光標時,我可以看到提供的所有參數,我不明白問題出在哪裏。請幫忙。請參見下面的代碼:存儲過程參數與AddWithValue()

object[] myValues = new Object[] { txtID.Text, ddlAmissionType.Text }; 
string[] paramsNames = new string[] { "@CHI", "@RequestType"}; 
dbConn.addData("sp_add_Request", paramsNames, myValues, lbMsg.Text); 

父類的方法:

public static bool addData(string storedProcName, string[] dynamicParamName, object[] aramVals, string msg) 
{  
    for (int i = 0; i < dynamicParamName.Length; i++) 
    { 
      cmd2.Parameters.AddWithValue(dynamicParamName[i], paramVals[i]); 
      //cmd2.Parameters.Add(dynamicParamName[i], dynamicParamValues[i]); 

      try 
      { 
      if (cmd2.Connection.State == ConnectionState.Closed) 
      { 
       cmd2.Connection.Open(); 
       int stat = cmd2.ExecuteNonQuery();  
       if (stat > 0) 
       { 
        res = true; 
        msg = "Recorded Added successfully"; 
        cmd2.Connection.Close(); 
        cmd2.Dispose(); 
       } 
      } 
     }  
} 

回答

2

你在你的循環,因爲該命令中的for循環執行訪問數據庫。所以你在第二個參數被添加之前執行你的命令。移動for循環外的try塊,你應該沒問題。

public static bool addData(string storedProcName, string[] dynamicParamName, object[] paramVals, string msg) 
{  
    for (int i = 0; i < dynamicParamName.Length; i++) 
    { 
      cmd2.Parameters.AddWithValue(dynamicParamName[i], paramVals[i]); 
      //cmd2.Parameters.Add(dynamicParamName[i], dynamicParamValues[i]); 
    }  
    try 
    { 
     if (cmd2.Connection.State == ConnectionState.Closed) 
     { 
      cmd2.Connection.Open(); 
     } 
     int stat = cmd2.ExecuteNonQuery();  
     if (stat > 0) 
     { 
      res = true; 
      msg = "Recorded Added successfully"; 
      cmd2.Connection.Close(); 
      cmd2.Dispose(); 
     } 
    } 
} 

您可能想要繼續,並將您的連接對象放入using語句中,以便它自動處理。下面@ abatishchev的答案顯示了處理你的ado對象的正確方法。

+0

喬希您好,我做了你所說的話,跑到光標,但我仍然得到同樣的結果。當我檢查參數值的計數時,它仍然顯示一個。見我的變化如下: 嘗試 { 對(INT I = 0;我 Jim

+0

看起來像它仍然在外面。我將以上面的樣子編輯我的答案。 – Josh

+0

你好喬希,謝謝你,我做了你所建議的改變,它的工作。非常感謝。我也會嘗試abatishchev的方法。謝謝你們 – Jim

0

每次調用方法時都會創建,使用和配置新的連接/命令對象。這將使用連接池和其他性能積極的技術。

public static bool addData(string storedProcName, string[] dynamicParamName, object[] paramVals, string msg) 
{ 
    SqlParameter[] paramArr = new SqlParameter[dynamicParamName.Length]; 
    for(int i = 0; i < dynamicParamName.Length; i++) 
    { 
     paramArr[i] = new SqlParameter(dynamicParamName[i], paramVals[i]); 
    } 

    using (SqlConnection connection = new SqlConnection(connectionString)) 
    using (SqlCommand command = connection.CreateCommand()) 
    { 
     command.CommandText = commandText; 
     //command.CommandType = CommandType.StoredProcedure ; // if needed 

     command.Parameters.AddRange(paramArr); 

     connection.Open(); 
     return command.ExecuteNonQuery() > 0; 
    } 
} 

MSDNSqlParameterCollection.AddRange()方法。

你也可以使用LINQ:

SqlParameter[] paramArr = dynamicParamName 
    .Select((paramName,i) => new SqlParameter(paramName, paramVals[i]).ToArray(); 

SqlParameter[] paramArr = Enumerable.Range(0, dynamicParamName.Length - 1) 
    .Select(i => new SqlParameter(dynamicParamName[i], paramVals[i]) 
    .ToArray(); 
+0

非常感謝讓我嘗試AddRange ...但是,AddwithValue是否有問題,我嘗試使用它? – Jim