作为.Net编程的新用户,我试图理解为什么这种连接失败了。运行catch异常以通知我这样的情况。有人可以指出我的代码中有什么问题。非常感谢
Imports System.Data.OleDb
Public Class DbTest
Public buttonName As String
'Dim con1 As New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=C:\domain\storage2.accdb")
Private Sub racksfrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
lblRacks.Text = buttonName
Dim connetionString As String
Dim oledbCnn As OleDbConnection
Dim oledbCmd As OleDbCommand
Dim sql As String
connetionString = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=C:\domain\storage2.accdb"
sql = "SELECT [Rack_code] FROM Racks Where [Rack_code] = '" & buttonName & "'"
oledbCnn = New OleDbConnection(connetionString)
Try
oledbCnn.Open()
oledbCmd = New OleDbCommand(sql, oledbCnn)
Dim oledbReader As OleDbDataReader = oledbCmd.ExecuteReader()
While oledbReader.Read
MsgBox(oledbReader.Item(0) & " - " & oledbReader.Item(1) & " - " & oledbReader.Item(2))
End While
oledbReader.Close()
oledbCmd.Dispose()
oledbCnn.Close()
Catch ex As Exception
MsgBox("Can not open connection ! ")
End Try
End Sub
Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
Me.Close()
End Sub
End Class
答案 0 :(得分:3)
错误消息表示您的查询包含的名称无法识别为字段名称或表名称。因此,name
被视为参数,但OleDbCommand
没有定义参数,因此错误消息。
在您的查询中,您只有一个字段,并且名为Rack_Code
,而表名为Racks
您应该检查这些是否真的是您的对象的名称。
但是您的代码还存在其他一些问题
您查询数据库,询问Rack_Code
的值,但您已经知道该值,因为WHERE子句是WHERE Rack_Code = ....
最后,如果该查询成功运行,您将遇到另一个问题,因为您只要求一个字段(Rack_Code),但在循环中,您尝试显示三个字段的值(Item(0),Item( 1)和项目(2),但SELECT字段列表中缺少两个项目。
编辑根据您的问题发表评论。如果您在单词Rack和单词代码之间有空格,那么您应该使用该字段名称来保留空格而不是用下划线替换它
sql = "SELECT [Rack code] FROM Racks Where [Rack code] = ....."
所以,我会将你的代码改为这个
Try
sql = "SELECT [Rack Code], SecondFieldName, ThirdFieldName " & _
"FROM Racks Where [Rack Code] = ?"
Using oledbCnn = New OleDbConnection(connetionString)
Using oledbCmd = New OleDbCommand(sql, oledbCnn)
oledbCnn.Open()
oledbCmd.Parameters.AddWithValue("@p1", Convert.ToInt32(buttonname))
Using oledbReader = oledbCmd.ExecuteReader()
if oledbReader.Read() Then
txtCols.Text = oledbReader.Item(0).ToString() & _
" - " & oledbReader.Item(1).ToString() & _
" - " & oledbReader.Item(2).ToString())
Else
txtCols.Text = "No records found for the Rack Code used"
End If
End Using
End Using
End Using
Catch ex As Exception
MsgBox("Problems executing command: " & ex.Message)
End Try
我已将您的查询更改为使用参数化方法,当然,我认为变量buttonname
已针对某些实际Rack Code
值正确初始化
答案 1 :(得分:2)
在您的来源中,我希望您检查几点。
buttonName
,或者我们无法看到它。所以它可能是空的,你的recordSet可能是空的SELECT [Rack_code] FROM Racks ...
),但您尝试访问多个字段(请参阅下面的来源)< / LI>
-
While oledbReader.Read
' Item(1) ?? Item(2) ??? try removing those and just select Item(0)
MsgBox(oledbReader.Item(0) & " - " & oledbReader.Item(1) & " - " & oledbReader.Item(2))
End While
您可以找到一些好示例如何在MSDN - OleDbDataReader或Read-Method example
中使用oledb查询数据库答案 2 :(得分:2)
如评论中所述,您的WHERE参数似乎未设置:
Public buttonName As String
Private Sub racksfrm_Load(ByVal sender As System.Object,... Handles MyBase.Load
lblRacks.Text = buttonName
没有buttonName取值的位置。初始化时将其设置为某个默认值:
Public buttonName As String = "foo"
其次,您的查询毫无意义且错误。如果您知道Rack_Code(WHERE),则没有理由将它也作为SELECT列。这是错误的,因为在几行中,您的代码将在结果中查找三列:
MsgBox(oledbReader.Item(0) & " - " & oledbReader.Item(1) & " - " & _
oledbReader.Item(2))
您的查询应该更像:SELECT X, Y, Z FROM Racks WHERE Rack_Code ='" & buttonName & "'"