变量名称' @ sno'已经宣布。变量名在查询批处理或存储过程中必须是唯一的

时间:2014-04-16 10:28:54

标签: c#

这是我的代码,它会给出以下错误。

已声明变量名'@sno'。变量名在查询批处理或存储过程中必须是唯一的。

private void btnBatchInsert_Click(ArrayList data)
    {
        // Get the DataTable with Rows State as RowState.Added
         SqlCommand command = new SqlCommand();
       sqlcon.Open();

        for (int j = 0; j < data.Count; j++)
        {

            string[] arr = data[j].ToString().Split('#');


        // Set the Parameter with appropriate Source Column Name
            command.Parameters.Add("@sno",  arr[0].ToString());
        command.Parameters.Add("@IMECode",  arr[1].ToString());
        command.Parameters.Add("@rcptno",  arr[2].ToString());
        command.Parameters.Add("@InvoiceNo",  arr[3].ToString() );

        command.Parameters.Add("@CSSNo",  arr[4].ToString());
        command.Parameters.Add("@Invoicedate", arr[5].ToString());
        command.Parameters.Add("@Name",  arr[6].ToString());
        command.Parameters.Add("@PlanNo",   planMode(arr[7].ToString()) );

        command.Parameters.Add("@Mode",  PlanType(arr[8].ToString()));
        command.Parameters.Add("@Installamount", Convert.ToDouble(arr[9].ToString().Equals("") ? "0" : arr[9].ToString()).ToString());
        command.Parameters.Add("@Spotcommi",  Convert.ToDouble(arr[10].ToString().Equals("") ? "0" : arr[10].ToString()).ToString() );
        command.Parameters.Add("@Applicationfee", Convert.ToDouble(arr[11].ToString().Equals("") ? "0" : arr[11].ToString()).ToString());

        command.Parameters.Add("@Netamount",  (Convert.ToDouble(arr[12].ToString().Equals("") ? "0" : arr[12].ToString()) + Convert.ToDouble(arr[11].ToString().Equals("") ? "0" : arr[11].ToString())).ToString() );
        command.Parameters.Add("@Adjmount", Convert.ToDouble(arr[13].ToString().Equals("") ? "0" : arr[13].ToString()).ToString() );
        command.Parameters.Add("@csc_name", arr[14].ToString());

        command.Connection = sqlcon;
        //cmd.CommandText = "Insert into [Personal_information_ofcandidat](User_id,Name,MName,LName,Exam_date,Exam_id,College_Name,Email_id,Phone_no) values('" + userid + "','" + uname + "','" + muname + "','" + luname + "','" + DateTime.Now + "','" + examid + "','" + collegname + "','" + email + "','" + mobile + "')";

        command.CommandText = "insert into  tempforagreementlist(sno,IMECode,rcptno,InvoiceNo,CSSNo,Invoicedate,Name,PlanNo,Mode,Installamount,Spotcommi,Applicationfee,Netamount,Adjmount,csc_name) values(@sno,@IMECode,@rcptno,@InvoiceNo,@CSSNo,@Invoicedate,@Name,@PlanNo,@Mode,@Installamount,@Spotcommi,@Applicationfee,@Netamount,@Adjmount,@csc_name)";

        command.CommandType = CommandType.Text;


        int a = command.ExecuteNonQuery();
       }


    }

4 个答案:

答案 0 :(得分:4)

您正在循环中添加参数。通过循环的第二次,第三次,第四次等迭代:是的,你将添加重复项。

或者:

  • 清除迭代之间的参数
  • 覆盖值而不是添加新参数

答案 1 :(得分:0)

您不止一次添加所有变量...因为您在循环中执行此操作。

SqlCommand command = new SqlCommand(); // command that lasts 
                                       // across all iterations of loop

for (int j = 0; j < data.Count; j++) {
   // adding all parameters each time.

首先添加参数..然后在每次迭代时给它们一个值(而不是两者都有)。

答案 2 :(得分:0)

在每次迭代中,您需要创建一个新的SqlCommand实例并将其分配给命令,以便删除您之前添加的参数。

  for (int j = 0; j < data.Count; j++)
        {
 command = new SqlCommand();
            string[] arr = data[j].ToString().Split('#'); 

答案 3 :(得分:0)

最简单的解决方案是在循环外定义参数,将它们添加到Parameters集合中。在循环内部,您只更改值并执行命令

还尝试使用Parameter类型和大小非常具体,因为这样您就允许数据库引擎存储查询计划并在每个循环中重用它。这在表演方面可能很重要。

private void btnBatchInsert_Click(ArrayList data)
{
     sqlcon.Open();
     SqlCommand command = new SqlCommand();
     command.Connection = sqlcon;

     // Add to the parameters collection a specific parameter with appropriate type and size 
     command.Parameters.Add(new SqlParameter("@sno",  SqlDbType.NVarChar, 32));
     ....
     for (int j = 0; j < data.Count; j++)
     {
         command.Parameters["@sno"].Value = arr[0].ToString();
         ....
         command.ExecuteNonQuery();
     }
}