【问题标题】:I am trying to insert into a table in sql server but its giving an error that Incorrect Syntax near the keyword 'of'我正在尝试插入到 sql server 中的表中,但它给出了一个错误,即关键字“of”附近的语法不正确
【发布时间】:2016-05-12 07:04:02
【问题描述】:
                DBConnection objconn = new DBConnection();
              objconn.connection(); //calling connection   

              System.Data.SqlClient.SqlCommand com = new System.Data.SqlClient.SqlCommand("tbl_srsdata", objconn.con);
              com.CommandType = System.Data.CommandType.Text;
              var rows = Table1.Items;
     TextBlock field;
              TextBlock type;
              TextBlock datatype;
              TextBlock len;
              TextBlock buis;
              int id;
     id = Redirect.identity;
              MessageBox.Show(id.ToString());
              for (int i = 0; i < rows.Count; i++)
              {
     DataGridRow row = (DataGridRow)Table1.ItemContainerGenerator.ContainerFromIndex(i);
                  for (int j = 0; j < Table1.Columns.Count; j++)
                  {
                      field = Table1.Columns[j].GetCellContent(row) as TextBlock;
                      j++;
                      type = Table1.Columns[j].GetCellContent(row) as TextBlock;
                      j++;
                      datatype = Table1.Columns[j].GetCellContent(row) as TextBlock;
                      j++;
                      len = Table1.Columns[j].GetCellContent(row) as TextBlock;
                      j++;
                      buis = Table1.Columns[j].GetCellContent(row) as TextBlock;
                      j++;
    com.CommandText = "insert into tbl_srsdata(id,field,[type_of_control],datatype,length,other_buisness_rules) values( " + id + ", " + field.Text + "," + type.Text + "," + datatype.Text + "," + len.Text + "," + buis.Text + ");"; 
                      com.ExecuteNonQuery();
                  }
    }

最后一行出现错误。错误是: System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理。 附加信息:关键字“of”附近的语法不正确。 谁能帮我解决这个问题。

【问题讨论】:

  • 显示一个失败的示例 com.CommandText - 密钥将在其中 - 此外,您可能需要在文本字段周围加上引号..
  • 如果您要插入文本字段,您应该用引号括起来。
  • 你能告诉我应该在哪里用引号括起来吗?
  • DeepanshiBansal - 请参阅@DmitriyZapevalov 提供的答案,这是编写 ado.net 的正确方法。 始终在您的数据库调用中使用参数。
  • 您还应该始终将数据库连接包装在using 块中,以确保它们在您完成后立即关闭。否则,您可能会拥有比所需时间更长的开放连接,这可能会导致性能问题(除其他外)。

标签: c#


【解决方案1】:

将文本从 TextBox 集成到查询中是个坏主意。

您必须添加文本作为参数:

com.CommandText = "insert into tbl_srsdata(id,field,[type_of_control],datatype,length,other_buisness_rules) values(@id,@field,@type,@datatype,@len,@buis)";
com.Parameters.AddWithValue("@id", id);
com.Parameters.AddWithValue("@field", field.Text);
com.Parameters.AddWithValue("@type", type.Text);
com.Parameters.AddWithValue("@datatype", datatype.Text);
com.Parameters.AddWithValue("@len", len.Text);
com.Parameters.AddWithValue("@buis", buis.Text);
com.ExecuteNonQuery();

将文本直接集成到查询中可能会导致错误和安全问题。

我不知道你程序的逻辑是什么。但我建议(可能是错误的)这样写:

if (!Table1.Items.Any())
    return;

string strInsertCmd = 
    "insert into tbl_srsdata(id,field,[type_of_control],datatype,length,other_buisness_rules)"+
    "values(@id,@field,@type,@datatype,@len,@buis)";

using (var com = new System.Data.SqlClient.SqlCommand(strInsertCmd, objconn.con))
{
    var rows = Table1.Items;
    int id;
    id = Redirect.identity;
    MessageBox.Show(id.ToString());
    for (int i = 0; i < rows.Count; i++)
    {
        DataGridRow row = (DataGridRow)Table1.ItemContainerGenerator.ContainerFromIndex(i);
        var field = Table1.Columns[0].GetCellContent(row) as TextBlock;
        var type = Table1.Columns[1].GetCellContent(row) as TextBlock;
        var datatype = Table1.Columns[2].GetCellContent(row) as TextBlock;
        var len = Table1.Columns[3].GetCellContent(row) as TextBlock;
        var buis = Table1.Columns[4].GetCellContent(row) as TextBlock;

        com.Parameters.Clear();
        com.Parameters.AddWithValue("@id", id);
        com.Parameters.AddWithValue("@field", field.Text);
        com.Parameters.AddWithValue("@type", type.Text);
        com.Parameters.AddWithValue("@datatype", datatype.Text);
        com.Parameters.AddWithValue("@len", len.Text);
        com.Parameters.AddWithValue("@buis", buis.Text);
        com.ExecuteNonQuery();
    }
}

【讨论】:

  • 非常感谢.. !!它第一次工作,但是当它进入外部循环并再次进入第二个循环时,它在 com.ExecuteNonQuery() 上给出错误并说:变量名'@id'已经被声明。变量名称在查询批处理或存储过程中必须是唯一的。
  • 尝试在第一个AddWithValue()之前添加com.Parameters.Clear();
  • 另外,您似乎有逻辑错误。由于您对所有参数都采用相同的Cell。可能必须只有一个Rows 循环。我会建议重写版本。
【解决方案2】:

请更改命令文本如下

    "insert into tbl_srsdata(id,field,[type_of_control],datatype,length,other_buisness_rules) values( " + id + ", '" + field.Text + "','" + type.Text + "','" + datatype.Text + "'," + len.Text + ",'" + buis.Text + "');"

【讨论】:

  • 您应该始终参数化查询以避免语法错误和 sql 注入攻击。您也没有考虑如果传入的参数包含刻度/单引号会怎样。
  • 它完全基于用户想要使用的内容。答案是针对她所面临的问题。我认为您不会投票赞成正确的答案。 @Igor 你的笔记可能是一种增强。
  • @AkashAmin - 我的反对票绝不是主观的。建议的修复不能解决问题。如果datatype.Text 包含字符串"some ' datatype" 怎么办?那么问题还是会出现不是吗?在不使用参数化 sql 的情况下构建查询字符串是一种非常糟糕的做法,即使参数被转义和检查(它们也不在这个答案中),也不应该被建议作为答案。
  • @Igor 我完全同意你的回答,但你不要投反对票,你可以在答案中添加评论。你总能从不同的人那里得到不同的答案。
【解决方案3】:

发生这种情况的原因可能有很多。您可以提供您尝试插入的输入。

无论如何,你必须检查你的输入数据:

  • INSERT 数据中是否存在非数字或文本部分?如果是这样,字符串文字需要用单引号括起来 (')。
  • 如果输入是字符串文字,请检查输入本身是否包含单引号。如果是这样,您需要使用两个单引号 ('') 对其进行转义。

【讨论】:

  • 虽然这可能是一个快速修复,但这绝对不是执行 ado.net 命令的推荐方式。您应该始终参数化查询以避免语法错误和 sql 注入攻击。
猜你喜欢
  • 2020-10-20
  • 2018-08-02
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多