VB.NET连接SQL Server报错Must declare the scalar variable "@" 求助
VB.NET WinForm查询SQL Server报错
Must declare the scalar variable "@"修复方案 错误根因
SQL语句中的参数写法不符合SQL Server解析规则:
原SQL里写的查询条件为[Roll No.]=@[Roll No.],SQL Server解析参数时,会将@后紧邻的非法字符截断,最终识别到的参数名为空的@,和后续代码里添加的@Roll No.参数完全不匹配,因此抛出变量未声明的错误。
注意:方括号
[]仅用于转义数据库中带特殊字符、空格的字段名/表名,参数名不能放在方括号里跟在@后面。
其他潜在问题
- 数据库连接、SqlCommand、SqlDataAdapter均为实现了IDisposable的资源,原代码未做释放处理,长期运行会出现连接泄漏、内存占用过高问题
- 直接将文本框输入值赋值给Int类型参数,未做合法性校验,用户输入非数字内容时会触发类型转换错误
- 参数名带空格虽然语法允许,但极易出现解析、匹配错误,不推荐使用
修复后完整代码
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click ' 先校验输入是否为合法数字 Dim rollNo As Integer If Not Integer.TryParse(TextBox5.Text, rollNo) Then MessageBox.Show("请输入合法的 Roll 编号") Return End If ' 用Using块自动释放数据库资源,无需手动Close/Dispose Using con As New SqlConnection("Data Source=LAPTOP-16IIQENS\SQLEXPRESS;Initial Catalog=students;Integrated Security=True") con.Open() ' 修正参数写法:字段用[]转义,参数名不带空格、不加方括号 Dim cmd As New SqlCommand("select * from data where [Roll No.]=@RollNo", con) ' 参数名和SQL中保持一致,传入校验后的整型值 cmd.Parameters.Add("@RollNo", SqlDbType.Int).Value = rollNo Dim adp As New SqlDataAdapter(cmd) Dim table As New DataTable() adp.Fill(table) If table.Rows.Count() > 0 Then DataGridView1.DataSource = table TextBox2.Text = table.Rows(0)(0).ToString() TextBox1.Text = table.Rows(0)(1).ToString() TextBox3.Text = table.Rows(0)(2).ToString() TextBox4.Text = table.Rows(0)(3).ToString() Else MessageBox.Show("No Data Found") End If End Using End Sub
核心修改点
- 把SQL语句里的错误参数
@[Roll No.]改为合法参数名@RollNo,去掉参数外层的方括号 - 新增学号输入的数字类型校验,避免类型转换错误
- 用
Using块包裹所有数据库相关对象,执行完成后自动释放资源,避免连接泄漏 - 参数赋值直接传入校验后的整型值,不再直接传文本框的字符串内容
内容的提问来源于stack exchange,提问作者Mahi
相关产品推荐
相关产品推荐

