2013-07-29 73 views
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); 

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

+0

数据库表中的列是什么? –

+1

想象一下,如果用户在文本框中输入“some”值“e”,会发生什么情况。 –

+0

你的数据库允许在特定列上使用char/varchar吗?你在用什么数据库? – butterbox

回答

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。使用参数化方法不是。

0

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

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

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

现在图像如果用户输入了类似'blablabla';DROP TABLE sometable;--的东西,会发生什么情况。这将导致执行Delete命令。这是一种标准的SQL注入攻击情形。

还有很多问题,例如当您尝试将数字与浮点数,日期或任何类型的转换为字符串取决于您的区域设置。

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

相关问题