无法将文本框中的字符值插入数据库

时间:2013-07-29 12:14:55

标签: c# .net sql ado.net

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

 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);

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

2 个答案:

答案 0 :(得分: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 Injection对你的写作方式开放。使用参数化方法不是。

答案 1 :(得分:0)

这是一个非常危险的代码行。

对于初学者,您正在创建一个字符串,其中没有任何分隔符值,这意味着唯一可以通过问题传递的值是整数。其他任何东西都需要分隔,你不会在这个String.Format语句中做。

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

现在想象如果用户输入'blablabla';DROP TABLE sometable;--之类的内容会发生什么。这将导致Delete命令执行。这是标准的SQL注入攻击场景。

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

不应尝试通过字符串连接构建SQL查询,而应使用参数化查询,如Give me parameterized SQL or give me death中所述。生成的代码更容易编写,执行速度更快,没有转换错误,并且不受SQL注入攻击,