0

试图从文本框插入数据库,但它只接受整数而不接受字符 - 问题可能是什么?

 string sCMD = string.Format("INSERT INTO [Table] ([Item], [Des1],[Des2], [Prodline], [ANR], [STime]) VALUES({0},{1},'0',{2},{3},{4})"
            ,txtText1.Text, txtText2.Text, txText3.Text, txtText4.Text, txtText5.Text);

在此上下文中不允许使用名称“”。有效表达式是常量、常量表达式和(在某些情况下)变量。不允许使用列名。

4

2 回答 2

0

这里有一些需要考虑的事情:

using (SqlConnection c = new SqlConnection(connString))
{
    c.Open();

    using (SqlCommand cmd = new SqlCommand("INSERT INTO [Table] ([Item], [Des1],[Des2], [Prodline], [ANR], [STime]) VALUES(@Item,@Des1,'0',@ProdLine,@ANR,@STime)", c))
    {
        cmd.Parameters.AddWithValue("@Item", txtText1.Text);
        cmd.Parameters.AddWithValue("@Des1", txtText2.Text);
        cmd.Parameters.AddWithValue("@ProdLine", txText3.Text);
        cmd.Parameters.AddWithValue("@ANR", txtText4.Text);
        cmd.Parameters.AddWithValue("@STime", txtText5.Text);

        cmd.ExecuteNonQuery();
    }
}

如果您要将正在构建的 SQL 语句发送到服务器,它可能看起来像这样:

INSERT INTO [Table] ([Item], [Des1],[Des2], [Prodline], [ANR], [STime])
VALUES(Item Name,Here is my description.,'0',Prod line,ANR value,some time)

显然这会失败。它甚至没有用单引号包围这些值。现在,他们可能都不是性格,我明白了,但你明白我的意思。

但是雪上加霜的是,它对SQL 注入是开放的,就像你编写它的方式一样。使用参数化方法并非如此。

于 2013-07-29T12:21:36.373 回答
0

这是非常危险的代码行。

对于初学者,您正在为值创建一个没有任何分隔符的字符串,这意味着唯一可以通过我们的问题传递的值是整数。其他任何内容都需要进行分隔,您不会在此 String.Format 语句中执行此操作。

更糟糕的是,您正试图从直接用户输入创建一个 sql 语句。任何奇怪的值都可能导致您的代码失败,或者更糟糕的是,导致执行不需要的代码。'sdf','sdfs',sdf'想象一下在用户输入例如FIRST 值时会发生什么。对于来自第一个文本框的前三列,生成的字符串将具有 3 个正确值。

现在想象一下如果用户输入类似'blablabla';DROP TABLE sometable;--. 这将导致Delete命令执行。这是一个标准的 SQL 注入攻击场景。

还有更多问题,例如,当您尝试使用浮点数、日期或任何转换为​​字符串取决于您的语言环境的类型传递数字时。

您应该使用参数化查询,而不是尝试通过字符串连接构造 SQL 查询,如给我参数化 SQL 或给我死亡中所述。生成的代码更容易编写,执行速度更快,没有转换错误并且不受 SQL 注入攻击,

于 2013-07-29T12:26:51.007 回答