我正在通过 vb.net 应用程序编写一个简单的SQL Server查询操作。我遇到了一些奇怪的问题。
此行给出错误:
dr = cmd.ExecuteReader()
这给了我错误"无效的列名abhishek
"。这是我在TextBox1.Text
中提供的数据abhishek
。我想不出我身边的任何错误,因为这是一个简单的查询。我能够以不同的形式在同一表上运行其他查询,例如删除查询,因此这不是数据库问题。
知道出了什么问题吗?
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-PCSQLEXPRESS;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
如果名称字段是文本字段,则需要将文本框括在单引号中,但这是不明智的建议。处理这种情况的唯一好方法是通过参数化查询
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 块中
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
通过这种方式,连接在尽可能短的时间内保持打开状态,并且在异常情况下也会关闭并适当处理。