我正在通过vb.net应用程序编写一个简单的SQL Server查询操作。我有一些奇怪的问题。
这一行给出错误:
dr = cmd.ExecuteReader()
这给了我错误"无效的列名abhishek
。"此处abhishek
是我在TextBox1.Text
中提供的数据。我无法想到我身边的任何错误,因为这是一个简单的查询。我能够以不同的形式在同一个表上运行其他查询,比如删除查询,因此它不是数据库问题。
有任何疑问是什么?
reginfo
是表名。 name
是其中一个字段。
我的完整代码如下:
Imports System.Data.Sql
Imports System.Data.SqlClient
Public Class Form9
Dim con As New SqlConnection()
Dim cmd As New SqlCommand()
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
cmd.CommandText = "select * from reginfo where name=" + (TextBox1.Text) + ""
Dim dr As SqlDataReader
con.Open()
cmd.Connection = con
dr = cmd.ExecuteReader() '<<< This line is creating problem
If dr.Read() Then
TextBox2.Text = dr(0).ToString()
End If
con.Close()
End Sub
Private Sub Form8_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
con.ConnectionString = "Data Source=ABHISHEK-PC\SQLEXPRESS;Initial Catalog=locserver;Integrated Security=True;Pooling=False"
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
End Sub
End Class
答案 0 :(得分:2)
如果名称字段是文本字段,那么您需要将文本框用单引号括起来,但这是一个不好的建议。对这种情况唯一有效的方法是通过参数化查询
cmd.CommandText = "select * from reginfo where name=@name"
cmd.Parameters.AddWithValue("@name", TextBox1.Text)
Dim dr As SqlDataReader
con.Open()
cmd.Connection = con
dr = cmd.ExecuteReader()
此外,不要将全局对象保留为连接或命令。尽可能晚地实例化连接并尽快关闭它总是一个好习惯,更好地在使用块中
Using con = New SqlConnection(...connection string here....)
Using cmd = New SqlCommand("select * from reginfo where name=@name", con)
con.Open()
cmd.Parameters.AddWithValue("@name", TextBox1.Text)
Using dr = cmd.ExecuteReader
'.... do you reading
End Using
End Using
End Using
通过这种方式,连接可以在最短的时间内保持打开状态,并且在例外的情况下关闭并妥善处理。