我正在尝试构建一个可以通过ASP.Net和Microsoft SQL Server Management Studio将信息发送到数据库的Web表单。
它表示Table附近的语法不正确,这是我想要存储值的数据库中表的名称。
如果您需要我发布更多代码以便澄清,我会这样做。有谁知道什么可能是错的?
我感谢您提供的任何帮助
由于
编辑:
所以我将我的表名改为mynameTable,我收到了这个错误。它说字符串或二进制数据会被截断
答案 0 :(得分:2)
你至少有四个问题;其中两个导致您的INSERT
声明失败(请参阅下面的粗体标题),其中两个是设计缺陷(请参阅下面每个标题下的其他建议)。虽然我仅将设计缺陷列为“附加建议”,但实际上解决这些问题也很重要。
TABLE
是SQL关键字。 TABLE
是一个SQL关键字。 (Table
也是如此,因为SQL语法不区分大小写。)
如果你实际命名了你的表Table
,你需要通过将其放在方括号中来“转义”该名称:
INSERT INTO [Table] …
-- ^ ^
-- add these!
其他建议:更改表格的名称,以便提示表格中存储的数据或事实类型。考虑到每个人都知道Table
是一张桌子。但Table
包含某种个人数据并不明显;请拨打您的表格Customers
,Employees
,Hairdressers
等 - 或者如果确实没有更具体的字词,请将其称为Persons
。
TextBox
。将TextBox
附加到字符串中是没有意义的:
"… VALUES ('" + txtFName + "', …"
应该是:
"… VALUES ('" + txtFName.Text + "', …"
// ^^^^^
其他建议:您基本上是使用字符串连接动态创建SQL语句。你如何做到这一点的方式开启了SQL injection攻击的可能性。 (这是一种安全漏洞;如果你不知道它是什么,请研究一下!)
请改用参数化查询:
var cmd = new SqlCommand("INSERT INTO Persons (FirstName, LastName, …) VALUES (@FirstName, @LastName, …)", connection);
cmd.Parameters.AddWithValue("@FirstName", txtFName.Text);
cmd.Parameters.AddWithValue("@LastName", txtLName.Text);
…
你的SQL注入安全漏洞已经消失。此外,您不必担心正确转义用户可能在文本框中输入的引号字符('
)。
答案 1 :(得分:2)
表是关键字。您应该为表创建一个新名称。
参考: http://msdn.microsoft.com/en-us/library/ms189822%28v=sql.105%29.aspx
答案 2 :(得分:2)
您正在使用保留关键字TABLE
,首先要做的是以更易于理解的方式更改该名称。如果您无法更改该名称,则应使用该名称周围的方形托架。
但这只是第一个问题。然后你有另一个 您尝试创建连接字符串的sql命令,但是您将文本框对象放在串联而不是文本框的Text属性中。
SqlCommand cmd = new SqlCommand("INSERT INTO [TABLE] VALUES('" + txtFName.Text + "',....
这仍然是非常错误的,因为这会导致代码向SQL Injection开放,所以您真正需要做的就是开始使用parameterized query
SqlCommand cmd = new SqlCommand("INSERT INTO [TABLE] VALUES(@fname, @lname, ..... ");
cmd.Parameters.AddWithValue("@fname", txtFName.Text);
cmd.Parameters.AddWithValue("@lname", txtLName.Text);
... and so on for all the others fields ....