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

エラー メッセージは、フィールドの名前またはテーブルの名前として認識されない名前がクエリに含まれていることを意味します。したがって、nameはパラメータとして扱われますが、OleDbCommandにはパラメータが定義されていないため、エラー メッセージが表示されます。
クエリには、フィールドが 1 つしかなく、名前が付けられRack_Code、テーブルには名前が付けられていますRacks
これらが実際にオブジェクトの名前であるかどうかを確認する必要があります。

ただし、コードには他にもいくつかの問題があります。
の値を求めるデータベースにクエリを実行しますがRack_Code、WHERE 句がWHERE Rack_Code = ....

最後に、そのクエリが正常に実行された場合、1 つのフィールド (Rack_Code) のみを要求したため、別の問題が発生しますが、ループでは 3 つのフィールド (Item(0)、Item(1)、およびItem(2) ですが、SELECT フィールド リストに 2 つの項目がありません。

編集質問の下のコメントに従ってください。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

コメントで説明されているように、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 列にする理由はありません。わずか数行でコードが結果の 3 つの列を検索するため、これは誤りです。

 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 に答える
2

あなたの情報源には、確認していただきたい点がいくつかあります。

  1. 設定されていない buttonNameか、表示されません。空である可能性があり、あなたのrecordSetはおそらく空になるでしょう
  2. テーブルから 1 つのフィールドのみを選択し (参照: 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を使用してデータベースにクエリを実行する方法の良い例をいくつか見つけることができます- OleDbDataReaderまたはRead-Method の例

于 2013-10-27T20:56:03.110 に答える