无法连接到数据库错误

时间:2013-10-27 20:20:39

标签: .net vb.net visual-studio-2010

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

3 个答案:

答案 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)

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

  1. 未设置 buttonName,或者我们无法看到它。所以它可能是空的,你的recordSet可能是空的
  2. 只从表格中选择一个字段(请参阅:SELECT [Rack_code] FROM Racks ...),但您尝试访问多个字段(请参阅下面的来源)< / LI>
  3. 无论何时遇到异常,都应记录/打印/跟踪异常消息。 (见MSDN
  4. -

    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 - OleDbDataReaderRead-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 & "'"