【问题标题】:Sql query execution inside a for loop在 for 循环中执行 Sql 查询
【发布时间】:2013-10-09 09:49:36
【问题描述】:
for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
{
    string toemail = GridView1.Rows[i].Cells[2].Text;
    string FID1 = GridView1.Rows[i].Cells[0].Text;
    GridViewRow row = GridView1.Rows[i];
    CheckBox Ckbox = (CheckBox)row.FindControl("CheckBoxMark1");
    if (Ckbox.Checked == true)
    {
        sendMail(toemail);

        //ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('Email send Succesfully')</script>");
        ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('Email sent Succesfully on " + test + "')</script>");

        cn1.Open();
       //cmd4.CommandText = "Insert into TrackingFaculty_det  (EmailsentDate)  values (@EmailsentDate) WHERE FID=@FID";
       cmd4.CommandText = "update TrackingFaculty_det SET EmailsentDate=@Email WHERE FID=@FID  ";
       cmd4.CommandType = CommandType.Text;
       cmd4.Connection = cn1;

       cmd4.Parameters.Add("@Email", SqlDbType.DateTime, 8);
       cmd4.Parameters["@Email"].Value = sdt;
       cmd4.Parameters.Add("@FID",SqlDbType.VarChar,10);
       cmd4.Parameters["@FID"].Value = FID1;
       cmd4.ExecuteNonQuery();
       cn1.Close();
    }
}

//这是c#代码的一部分以及asp.net

如果每当for loop 被执行,updation 应该在database 中执行,但当for loop 执行不止一次时,update 查询将给出错误The variable name '@Email' has already been declared. Variable names must be unique within a query batch or stored procedure..Any解决办法?

【问题讨论】:

  • 使用SP and TableValueParameters 或者不要重复使用命令
  • 清除cmd4.ExecuteNonQuery();之后cmd4的参数

标签: c# asp.net sql-server-2008


【解决方案1】:

只需将循环的不变部分移到循环之外。也就是说,SqlCommand的初始化,连接的打开和参数集合的创建。
然后在循环内只需更改参数的值并执行。 (这总是比在循环内重新创建相同的参数列表更快)

   SqlCommand cmd4 = new SqlCommand("update TrackingFaculty_det " + 
                                    "SET EmailsentDate=@Email WHERE FID=@FID", cn1);
   cn1.Open();
   cmd4.Parameters.Add("@Email", SqlDbType.DateTime, 8);
   cmd4.Parameters.Add("@FID",SqlDbType.VarChar,10);
   for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
   {
       .....
       if (Ckbox.Checked == true)
       {
          ....
          cmd4.Parameters["@Email"].Value = sdt;
          cmd4.Parameters["@FID"].Value = FID1;
          cmd4.ExecuteNonQuery();
       }
   }
   cn1.Close();

【讨论】:

    【解决方案2】:

    尝试清除命令参数-

    cmd4.Parameters.Clear();
    

    然后添加参数

    cmd4.Parameters.Add("@Email", SqlDbType.DateTime, 8);
    

    所以你的最终代码是-

    cmd4.Parameters.Clear();  //  <- Just add this line
    cmd4.Parameters.Add("@Email", SqlDbType.DateTime, 8);
    

    【讨论】:

      【解决方案3】:

      cmd4 对象每次都要刷新。

        cmd4.Parameters.Add("@Email", SqlDbType.DateTime, 8);
        cmd4.Parameters["@Email"].Value = sdt;
        cmd4.Parameters.Add("@FID",SqlDbType.VarChar,10);
        cmd4.Parameters["@FID"].Value = FID1;
      

      您在“cmd4”的参数列表中多次添加相同的参数

      在再次添加相同的参数之前清除您的参数

      cmd4.Parameters.Clear();
      

      【讨论】:

      • 请详细说明一下好吗?
      【解决方案4】:

      查看Run Stored Procedure with table data as parameter

      或者第二个是在sql server中使用下面的示例和exec(string)创建字符串

      sqlstr= "update TrackingFaculty_det SET EmailsentDate=2@2.com WHERE FID=1; update TrackingFaculty_det SET EmailsentDate=1@1.com WHERE FID=@FID ;pdate TrackingFaculty_det SET EmailsentDate=2@2.com WHERE FID=1;"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多