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."}
答案 0 :(得分:4)
您不断重复添加参数到命令对象。您应该将连接和命令对象移动到调用它们的方法中,并使用“using”语句。
因为您的连接和命令是类字段,所以循环的每个实例都会将参数重新添加到旧的参数集中。至少,重置循环顶部的参数集合。
答案 1 :(得分:1)
您向该过程传递了太多参数。如果您粘贴过程代码我们可以帮助识别,但只需对params进行计数并检查以确保您已在proc中定义了所有内容。
答案 2 :(得分:0)
在添加参数之前调用Clear方法。
答案 3 :(得分:0)
它首次运行,因为您的command
对象没有参数。对于每个后续迭代,您将继续向command
对象添加另一组参数。
每次迭代都需要clear the parameters command
个对象。
答案 4 :(得分:0)
我没有在您的示例中看到生成SqlCommand
对象的任何代码。
如果命令是该类的本地命令,则很可能已经使用它(这意味着它可能已经添加了参数)。
我也看不到将命令类型设置为StoredProcedure
的代码。根据命令文本的内容,这也可能是问题(如果您只是在不设置类型的情况下传递存储过程名称......它将看到命令没有参数)。
重新编写代码以使用自己的SqlConnection
和SqlCommand
将使调试变得更加容易(当然,除非它已经存在并且您没有给我们代码)。
修改强>
我刚注意到你在foreach循环中使用代码而没有清除参数。这是另一个问题(可能是这个问题的最可能原因)。在添加新参数之前,请务必在每个循环开始时调用command.Parameters.Clear()
。