SQL异常求助:System.Data.SqlClient.SqlException:Incorrect syntax near 'Information'
咱们先从你遇到的核心错误说起:System.Data.SqlClient.SqlException: Incorrect syntax near 'Information',这个问题的根源很明确——你的表名Patient Information包含空格,SQL Server解析时会把Patient当成表名,Information当成额外的语法元素,自然就报错了。下面一步步帮你解决所有问题:
1. 给带空格的表名和列名加包裹
SQL Server要求包含空格或特殊字符的标识符(表名、列名)必须用方括号[]包裹起来。你的表名Patient Information,还有列名Patient ID、First Visit、Last Visit都带空格,所以要修改SQL语句的结构:
INSERT INTO [Patient Information] (F_Name, L_Name, [Patient ID], Disease, [First Visit], [Last Visit]) ...
2. 移除INSERT语句里多余的逗号
看你代码里的Insertquery,VALUES列表的最后一个值后面多了个逗号:
' 原代码里的错误写法 ..., ' " & TextBox7.Text & " ' ,)"
把这个多余的逗号删掉,改成:
..., ' " & TextBox7.Text & " ' )"
这个小细节也会引发SQL语法错误,别忽略它。
3. 替换字符串拼接为参数化查询(必须改的安全问题)
直接把TextBox的内容拼到SQL语句里是非常危险的——不仅容易因为用户输入单引号(比如名字O'Neil)触发语法错误,还会被SQL注入攻击。用参数化查询能一次性解决这两个问题,重构你的代码:
先修改Executequery方法,用Using语句自动管理资源(避免连接泄漏):
Public Sub Executequery(query As String, parameters As SqlParameterCollection) Using connection As New SqlConnection("Server=TAYYAB-PC\SQLEXPRESS;Database=Hospital Management;User=sa;Pwd=Password1;") Using command As New SqlCommand(query, connection) If parameters IsNot Nothing Then command.Parameters.AddRange(parameters.ToArray()) End If connection.Open() command.ExecuteNonQuery() End Using End Using End Sub
然后修改Button点击事件,用参数代替直接拼接:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 用@占位符标记参数位置 Dim Insertquery As String = "INSERT INTO [Patient Information] (F_Name, L_Name, [Patient ID], Disease, [First Visit], [Last Visit]) VALUES (@FName, @LName, @PatientID, @Disease, @FirstVisit, @LastVisit)" ' 创建参数集合,绑定输入框内容 Dim parameters As New SqlParameterCollection() parameters.Add(New SqlParameter("@FName", TextBox2.Text)) parameters.Add(New SqlParameter("@LName", TextBox3.Text)) parameters.Add(New SqlParameter("@PatientID", TextBox4.Text)) parameters.Add(New SqlParameter("@Disease", TextBox5.Text)) parameters.Add(New SqlParameter("@FirstVisit", TextBox6.Text)) parameters.Add(New SqlParameter("@LastVisit", TextBox7.Text)) Try Executequery(Insertquery, parameters) MsgBox("Data Inserted") Catch ex As Exception ' 捕获异常,方便调试 MsgBox($"插入失败:{ex.Message}") End Try End Sub
4. 修正连接字符串的冲突
你的连接字符串同时用了Integrated Security=True(Windows身份验证)和User=sa;Pwd=Password1(SQL身份验证),这两个是互斥的,只能二选一:
- 用SQL身份验证:去掉
Integrated Security=True;Trusted_Connection=True;,保留User=sa;Pwd=Password1; - 用Windows身份验证:去掉
User=sa;Pwd=Password1;,保留Integrated Security=True;
额外提醒
- 以后永远不要直接拼接用户输入到SQL语句里,参数化是行业标准
- 用
Using语句管理数据库连接和命令,确保资源被自动释放,避免内存泄漏 - 加上异常捕获,能帮你快速定位问题,也能给用户更友好的提示
内容的提问来源于stack exchange,提问作者Ch Tayyab

