2014-07-08 101 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