0

**簡単なアプリケーションがありますが、修正方法がわかりません。データベースを編集しようとしたときのこの写真 --> http://i861.photobucket.com/albums/ab171/gopak/sa_zps5a950df5.jpg

編集ボタンをクリックすると、アクセスデータが更新されます。これが私のコードです。アドバイスをありがとう**

Imports System.Data.OleDb
Public Class Form2
Public cnstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Gop's\Downloads\admin site\admin site\admin site\bin\Debug\data_ruangan.accdb"""
Public cn As New OleDbConnection
Public cmd As New OleDbCommand
Public adaptor As New OleDbDataAdapter

Private Sub logout_btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles logout_btn.Click
    Form1.Show()
    Me.Close()

End Sub

Private Sub exit_btn_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles exit_btn.Click
    Dim a As Integer
    a = MsgBox("Are you sure want to exit application?", vbInformation + vbYesNo, "Admin Site Virtual Tour Application")
    If a = vbYes Then
        End
    Else
        Me.Show()
    End If
End Sub

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'TODO: This line of code loads data into the 'Data_ruanganDataSet.data_ruangan' table. You can move, or remove it, as needed.
    Me.Data_ruanganTableAdapter.Fill(Me.Data_ruanganDataSet.data_ruangan)

End Sub

Private Sub DataGridView1_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
    Dim i = DataGridView1.CurrentRow.Index
    Label7.Text = DataGridView1.Item(0, i).Value
    txtName.Text = DataGridView1.Item(1, i).Value
    txtLocation.Text = DataGridView1.Item(2, i).Value
    txtCapacity.Text = (DataGridView1.Item(3, i).Value).ToString
    txtOperational.Text = (DataGridView1.Item(4, i).Value).ToString
    txtInformation.Text = DataGridView1.Item(5, i).Value
End Sub

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    'If txtName.Text <> "" And txtLocation.Text <> "" And txtCapacity.Text <> "" And txtOperational.Text <> "" And txtInformation.Text <> "" Then
    Dim i = DataGridView1.CurrentRow.Index
    Dim ID = DataGridView1.Item(0, i).Value
    Dim cmd As New OleDb.OleDbCommand

    If Not cn.State = ConnectionState.Open Then
        cn.Open()
    End If

    cmd.Connection = cn
    cmd.CommandText = ("update data_ruangan set Name = '" & txtName.Text & _
        "',Location = '" & txtLocation.Text & "',Capacity = '" & txtCapacity.Text & _
        "',Operational_Hours ='" & txtOperational.Text & "',Information = '" & txtInformation.Text & ";")
    cmd.ExecuteNonQuery()
    cn.Close()
    txtName.Text = ""
    txtLocation.Text = ""
    txtCapacity.Text = ""
    txtOperational.Text = ""
    txtInformation.Text = ""
    'End If
End Sub

Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick

  End Sub
End Class
4

1 に答える 1

0

パラメーター化されたクエリを使用してコードを実行してみてください。エラー メッセージは、ConnectionString に含まれる情報を使用して接続を初期化していないという事実に関連しています。
ここにそれを行う方法の例があります......しかし......

Dim cmdText = "update data_ruangan set [Name] = ?,Location = ?,Capacity = ?, " & _
              "Operational_Hours =?,Information = ?;"
Using cn = new OleDbConnection( cnstring )
Using cmd = OleDb.OleDbCommand(cmdText, cn)
    cn.Open
    cmd.Parameters.AddWithValue("@p1", txtName.Text)
    cmd.Parameters.AddWithValue("@p2", txtLocation.Text)
    cmd.Parameters.AddWithValue("@p3", txtCapacity.Text)
    cmd.Parameters.AddWithValue("@p4", txtOperational.Text)
    cmd.Parameters.AddWithValue("@p5", txtInformation.Text)

    '''' WARNING ''''
    ' WITHOUT A WHERE STATEMENT YOUR QUERY WILL UPDATE 
    ' THE WHOLE TABLE WITH THE SAME VALUES
    '''' WARNING ''''

    cmd.ExecuteNonQuery()
End Using
End Using
txtName.Text = ""
txtLocation.Text = ""
txtCapacity.Text = ""
txtOperational.Text = ""
txtInformation.Text = ""

このコードは、テーブルのすべてのレコードを同じ値で更新するため、レコードが 1 つしかなく、常に同じレコードを更新しない限り、コマンドに WHERE 条件を追加する必要があります。

また、NAME という単語は Access 2007/2010 の予約済みキーワードであり、構文エラー メッセージが表示されないように、その単語を角かっこで囲むことをお勧めします。

また、グローバル変数 OleDbConnection を削除し、コードが Using ステートメントを終了するときに閉じられて破棄されるローカル変数を使用しました。これは、使い捨てオブジェクトを処理する正しい方法です。特に、すべての接続オブジェクトは常にこの方法で使用され、オブジェクトが使用する高価なアンマネージ リソースをできるだけ早く解放します。

于 2013-06-16T13:44:02.640 に答える