使用C#调用存储过程

时间:2011-04-05 17:33:52

标签: c# sql-server ado.net

private void btnGo_Click(object sender, EventArgs e)
    {
        Array IDlist = txtUserID.Text.Split(new char[] { });
        ArrayList badID = new ArrayList();

        foreach (string textLine in IDlist)

        {

            try
            {

                int LineID = Convert.ToInt32(textLine);
                string emp = txtDistricts.Text;
                command.Parameters.Add("@EmpID", SqlDbType.Int).Value = LineID;

                if (!emp.Equals(string.Empty))
                    command.Parameters.Add("@SchoolDistricts", SqlDbType.NVarChar).Value = emp;
                else command.Parameters.Add("@SchoolDistricts", SqlDbType.NVarChar).Value = DBNull.Value;
                if (cbRemove.Checked)
                    command.Parameters.Add("@Options", SqlDbType.Int).Value = 1;
                else if (cbReset.Checked)
                    command.Parameters.Add("@Options", SqlDbType.Int).Value = 0;
                else command.Parameters.Add("@Options", SqlDbType.Int).Value = DBNull.Value;

                SqlParameter returnValue = new SqlParameter("@return_value", DbType.String);
                returnValue.Direction = ParameterDirection.ReturnValue;
                command.Parameters.Add(returnValue);

                conn.Open();
                command.Connection = conn;

                // command.ExecuteNonQuery();
                command.ExecuteScalar();

                String OutPutCheck = (command.Parameters["@return_value"].Value.ToString());
                String getCheck = (command.ExecuteScalar().ToString());
                OPBox.Text += LineID + "--->>" + OutPutCheck + "--->>" + getCheck + "\n";

                conn.Close();




                //flagUser(LineID, emp);
            }
            catch (Exception ex)
            {
                //stored procedure error
                badID.Add(textLine);
                conn.Close();
            }
        }}

我制作了一个APP,它一次需要一堆ID。在btn_click之后将这些值放入数组中。然后从数组中将每个ID逐个传递给存储过程,并获取返回值。 well第一个值给出返回值,但在第二个值传递给存储过程之后,它会产生以下错误。

> ERROR::::ex = {"Procedure or function
> usp_Flag_Employee has too many
> arguments specified."}

5 个答案:

答案 0 :(得分:4)

您不断重复添加参数到命令对象。您应该将连接和命令对象移动到调用它们的方法中,并使用“using”语句。

因为您的连接和命令是类字段,所以循环的每个实例都会将参数重新添加到旧的参数集中。至少,重置循环顶部的参数集合。

答案 1 :(得分:1)

您向该过程传递了太多参数。如果您粘贴过程代码我们可以帮助识别,但只需对params进行计数并检查以确保您已在proc中定义了所有内容。

答案 2 :(得分:0)

在添加参数之前调用Clear方法。

答案 3 :(得分:0)

它首次运行,因为您的command对象没有参数。对于每个后续迭代,您将继续向command对象添加另一组参数。

每次迭代都需要clear the parameters command个对象。

答案 4 :(得分:0)

我没有在您的示例中看到生成SqlCommand对象的任何代码。

如果命令是该类的本地命令,则很可能已经使用它(这意味着它可能已经添加了参数)。

我也看不到将命令类型设置为StoredProcedure的代码。根据命令文本的内容,这也可能是问题(如果您只是在不设置类型的情况下传递存储过程名称......它将看到命令没有参数)。

重新编写代码以使用自己的SqlConnectionSqlCommand将使调试变得更加容易(当然,除非它已经存在并且您没有给我们代码)。

修改

我刚注意到你在foreach循环中使用代码而没有清除参数。这是另一个问题(可能是这个问题的最可能原因)。在添加新参数之前,请务必在每个循环开始时调用command.Parameters.Clear()