2014-07-08 140 views
1

我的代碼中的問題在哪裏?將參數發送到存儲過程

我使用存儲過程和事務。

對於一個參數要正常工作,但是當參數的數量超過一個時會發生錯誤。

我的問題在哪裏?

這是我在C#

internal static bool ExecuteNonQueryTransaction(string CommandName, CommandType cmdType, SqlParameter[][] pars) 
    { 
     int result = 0; 
     SqlTransaction tr = null; 
     int h = pars.GetLength(0); 


     using (SqlConnection con = new SqlConnection(CONNECTION_STRING)) 
     { 
      if (con.State != ConnectionState.Open) 
      { 
       con.Open(); 
      } 


      try 
      { 
       tr = con.BeginTransaction(); 
       using (SqlCommand cmd = con.CreateCommand()) 
       { 
        cmd.CommandType = cmdType; 
        cmd.Transaction = tr; 
        cmd.CommandText = CommandName; 

        // cmd.Parameters.AddRange(pars); 
        for (int i = 0; i < pars.GetLength(0); i++) 
        { 
         cmd.Parameters.AddRange(pars[i]); 
      cmd.ExecuteNonQuery(); 
        } 

        tr.Commit(); 
       } 
      } 
      catch 
      { 
       if (tr != null) 
       { 
        tr.Rollback(); 
       } 
       //return false; 
      } 

     } 
     return (result > 0); 
    } 

代碼,這我的存儲過程

ALTER PROCEDURE dbo.AddNewUserTypePageAccess 
(@id_user_type int, 
@id_page_access int) 
as 
    insert into user_type_page_access(id_user_type, id_page_access) 
    values(@id_user_type, @id_page_access) 
    return 

謝謝你的幫助.....

回答

0

你不應該叫ExecuteNonQuery();內循環添加參數!添加全部參數,然後調用ExecuteNonQuery();一次,所有參數都已就位。

使用此代碼:

using (SqlCommand cmd = con.CreateCommand()) 
{ 
    cmd.CommandType = cmdType; 
    cmd.Transaction = tr; 
    cmd.CommandText = CommandName; 

    // cmd.Parameters.AddRange(pars); 
    for (int i = 0; i < pars.GetLength(0); i++) 
    { 
     cmd.Parameters.AddRange(pars[i]); 
    } 

    // call ExecuteNonQuery only AFTER you've added all the parameters! 
    cmd.ExecuteNonQuery(); 

    tr.Commit(); 
} 
+0

我做到了,但沒有奏效。我希望執行存儲過程n次,並且它們全都是交易。我發送2次參數n次 – nimaSadeghpour