这是我的代码,它会给出以下错误。
已声明变量名'@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();
}
}
答案 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();
}
}