代码之家  ›  专栏  ›  技术社区  ›  mahesh

使用运行时控件插入语句时出现SQL错误

  •  1
  • mahesh  · 技术社区  · 14 年前

    我使用的是C,vs 2005和SQL 2000

    我的代码是:

    StringBuilder sb = new StringBuilder();
    sb.Append("insert into dummy(name,amount)values");
    foreach (Control ctl in this.flowLayoutPanel1.Controls) 
    {
      if (ctl.Name.Contains("tb") && ctl is TextBox) 
      {
         sb.Append(ctl.Text);
      }
    } 
    
    foreach(Control bbl in this.flowLayoutPanel1.Controls)
    {
       if(bbl.Name.Contains("bb") && bbl is TextBox)
       {
         sb.Append(bbl.Text);
       }
    }
    
    SqlCommand cmd = new SqlCommand(sb.ToString(), con);
    cmd.CommandType = CommandType.Text;
    cmd.ExecuteNonQuery();
    

    它会引发如下错误:

    值附近有语法错误

    请帮帮我。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Community pid    7 年前

    值本身需要放在括号中,并用逗号分隔。

    我认为你的代码产生了:

    insert into dummy(name,amount)valuesthisname100
    

    但是你需要改变它来产生这个:

    INSERT INTO dummy (name, amount) VALUES ('thisname', 100)
    

    要做到这一点的一些示例代码是:

    StringBuilder sb = null;
    sb = new StringBuilder();
    sb.Append("insert into dummy(name,amount)values (");
    foreach (Control ctl in this.flowLayoutPanel1.Controls) 
    {
       if (ctl.Name.Contains("tb") && ctl is TextBox) 
       {
          sb.Append("'" + ctl.Text + "'");
       }
    } 
    sb.Append(", ");
    foreach(Control bbl in this.flowLayoutPanel1.Controls)
    {
       if(bbl.Name.Contains("bb") && bbl is TextBox)
       {
           sb.Append(bbl.Text);
       }
    }
    sb.Append(")");
    SqlCommand cmd1 = new SqlCommand(sb.ToString(), con);
    cmd1.CommandType = CommandType.Text;
    cmd1.ExecuteNonQuery();
    

    这段代码远不是理想的,但它应该修复您的SQL语法错误。您应该考虑的其他一些增强功能包括:

    • 确保在每个foreach循环中只找到一个文本框。如果多于一个,则字段计数将不匹配。
    • 输入验证或修复代码以确保用户输入的文本中不出现单引号字符,或者将SQL更改为使用参数(谢谢) Jon Skeet )
    • 进行验证以确保第二个文本框可以解析为数字(请参见int.typarse()),前提是您的amount字段是数字。

    然而,更好的方法是这样做( 编辑 为了帮助Mahesh编写代码,现在包括多个插件):

    string sName = null;
    double? nAmount = null;
    
    foreach (Control ctl in this.flowLayoutPanel1.Controls) 
    {
       if (ctl.Name.Contains("tb") && ctl is TextBox) sName = ctl.Text;
       if (ctl.Name.Contains("bb") && ctl is TextBox) 
       {
           double nTmp = 0;
           if (double.TryParse(ctl.Text, out nTmp)) nAmount = nTmp;
       }
    
       if (sName != null && iAmount != null) 
       {
          SqlCommand cmd1 = new SqlCommand("INSERT INTO dummy (name, amount) VALUES (@name, @amount)", con);
          cmd1.Parameters.Add("@name", SqlDbType.VarChar).Value = sName;
          cmd1.Parameters.Add("@amount", SqlDbType.Decimal).Value = nAmount;
          cmd1.ExecuteNonQuery();
          sName = null;
          nAmount = null;
       }
    }
    
        2
  •  1
  •   Jon Skeet    14 年前

    @Ardman提到了语法错误,但还有更重要的事情:你应该 像这样将用户输入的值追加到SQL中。

    使用参数化的SQL语句,并将值设置为参数。否则,您将面临SQL注入攻击。

        3
  •  1
  •   Neil Knight    14 年前

    看来你在括号后和括号后缺少了一个空格 VALUES . 你的开合括号不见了 价值观 语句。您还需要在插入的值后添加逗号,以便将它们分开。所以您的语法应该如下所示:

    insert into dummy(name,amount) values (textBox1value, textBox2value)
    

    编辑

    假设您的flowlayoutpanel中只有两个文本框控件,那么可以执行以下操作:

    StringBuilder sb = null; 
    sb = new StringBuilder(); 
    sb.Append("insert into dummy(name,amount)values ("); 
    foreach (Control ctl in this.flowLayoutPanel1.Controls)  
    { 
       if (ctl.Name.Contains("tb") && ctl is TextBox)  
      { 
         sb.Append(ctl.Text); 
      } 
    }  
    
    sb.Append(",");
    
    foreach(Control bbl in this.flowLayoutPanel1.Controls) 
    { 
       if(bbl.Name.Contains("bb") && bbl is TextBox) 
       { 
        sb.Append(bbl.Text); 
       } 
    } 
    
    sb.Append(")");
    

    但是,我会认真研究乔恩提出的解决方案。