0

作为 .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
4

3 回答 3

3

该错误消息意味着您的查询包含一个无法识别为字段名称或表名称的名称。因此, thatname被视为参数,但OleDbCommand没有定义参数,因此错误消息。
在您的查询中,您只有一个字段,并且Rack_Code在表被命名时被命名Racks
您应该检查这些是否真的是您的对象的名称。

但是,您的代码还有其他一些问题。
您查询数据库询问的值,Rack_Code但您已经知道该值,因为 WHERE 子句是WHERE Rack_Code = ....

最后,如果该查询成功运行,您将遇到另一个问题,因为您只要求了一个字段(Rack_Code),但在循环中您尝试显示三个字段(Item(0)、Item(1) 和Item(2),但 SELECT 字段列表中缺少两项。

编辑按照您在问题下的评论。如果您在单词 Rack 和单词 Code 之间有一个空格,那么您应该使用该字段名称来保留空格,而不是用下划线替换它

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

于 2013-10-27T20:55:10.217 回答
2

在您的来源中,我希望您检查几点。

  1. 不设置 buttonName,否则我们看不到。所以它可能是空的,你的记录集可能是空的
  2. 您从表中仅选择了一个字段(请参阅SELECT [Rack_code] FROM Racks ...:),但您尝试访问多个字段(请参阅下面的源代码
  3. 每当您捕获异常时,您都应该记录/打印/跟踪异常消息。(见MSDN

--

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 中找到一些如何使用 oledb 查询数据库的好示例- OleDbDataReaderRead-Method 示例

于 2013-10-27T20:56:03.110 回答
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 & "'"

于 2013-10-27T20:57:54.010 回答