用户代码中未处理的SqlException

时间:2014-12-16 22:09:06

标签: asp.net database visual-studio-2013 sqlexception ssms

我正在尝试构建一个可以通过ASP.Net和Microsoft SQL Server Management Studio将信息发送到数据库的Web表单。

enter image description here

enter image description here

它表示Table附近的语法不正确,这是我想要存储值的数据库中表的名称。

如果您需要我发布更多代码以便澄清,我会这样做。有谁知道什么可能是错的?

我感谢您提供的任何帮助

由于

编辑:

所以我将我的表名改为mynameTable,我收到了这个错误。它说字符串或二进制数据会被截断

enter image description here

3 个答案:

答案 0 :(得分:2)

你至少有四个问题;其中两个导致您的INSERT声明失败(请参阅下面的粗体标题),其中两个是设计缺陷(请参阅下面每个标题下的其他建议)。虽然我仅将设计缺陷列为“附加建议”,但实际上解决这些问题也很重要。

1。 TABLE是SQL关键字。

TABLE是一个SQL关键字。 (Table也是如此,因为SQL语法不区分大小写。)

如果你实际命名了你的表Table,你需要通过将其放在方括号中来“转义”该名称:

INSERT INTO [Table] …
--          ^     ^
--         add these!

其他建议:更改表格的名称,以便提示表格中存储的数据或事实类型。考虑到每个人都知道Table是一张桌子。但Table包含某种个人数据并不明显;请拨打您的表格CustomersEmployeesHairdressers等 - 或者如果确实没有更具体的字词,请将其称为Persons

2。您不能连接字符串和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 ....