将参数发送到存储过程

时间:2014-07-08 05:27:48

标签: sql stored-procedures transactions c#-3.0

我的代码中的问题在哪里?

我使用存储过程和事务。

要使一个参数正常工作,但当参数数量多于一个时,会发生错误。

我的问题在哪里?

这是我在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

感谢您的帮助.....

1 个答案:

答案 0 :(得分: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();
}