none
想設計 DataGridView 與 Access 同步更新,除錯時卻一直出現「無值提供給一或多個必要參數」的錯誤 RRS feed

  • 問題

  • 使用 VB 2008 + Access 

    以 Updata...Set... 語句為例,
    程式中使用 CellClick 事件抓取 Updata 語句中用到的 Where 欄位及欄位值

        Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            ColumnHeaderCell = DataGridView1.Columns(e.ColumnIndex).HeaderCell.Value
            OldValue = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
        End Sub


    再用 CellValueChanged 事件輸入新欄位值

        Private Sub DataGridView1_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
            NewValue = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
        End Sub

    最後將所有變數送給 CellEndEdit 事件執行 Updata...Set... 語句,執行結果出現了「無值提供給一或多個必要參數」的錯誤
        Private Sub DataGridView1_CellEndEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
            Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=C:\User_Info.mdb"
            Dim conn As OleDbConnection = New OleDbConnection(str)
            conn.Open()
    
            Dim str1 As String = "Update User_Info set '" & ColumnHeaderCell & "' = @NewValue Where '" & ColumnHeaderCell & "' = @OldValue"
            Dim cmd As OleDbCommand = New OleDbCommand(str1, conn)
    
            cmd.Parameters.AddWithValue("@NewValue", Trim(NewValue))
    cmd.Parameters.AddWithValue("@OldValue", Trim(OldValue)) cmd.ExecuteNonQuery() conn.Close() End Sub


    DataGridView 有啟用編輯功能,想完成直接點選欄位修改,修改完按下 Enter 後直接存取 Access 達成同步更新。
    請問是不是哪邊觀念錯了,還是語法錯了?



    完整程式

    Imports System.Data Imports System.Data.OleDb Public Class Form1 Dim ColumnHeaderCell As String Dim NewValue As String Dim OldValue As String Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick ColumnHeaderCell = DataGridView1.Columns(e.ColumnIndex).HeaderCell.Value OldValue = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value End Sub

    Private Sub DataGridView1_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
    NewValue = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
        End Sub

    Private Sub DataGridView1_CellEndEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=C:\User_Info.mdb" Dim conn As OleDbConnection = New OleDbConnection(str) conn.Open() Dim str1 As String = "Update User_Info set '" & ColumnHeaderCell & "' = @NewValue Where '" & ColumnHeaderCell & "' = @OldValue" Dim cmd As OleDbCommand = New OleDbCommand(str1, conn) cmd.Parameters.AddWithValue("@NewValue", Trim(NewValue)) cmd.Parameters.AddWithValue("@OldValue", Trim(OldValue)) cmd.ExecuteNonQuery() conn.Close() End Sub
    End Class

    • 已編輯 C.Kevin 2012年4月12日 上午 08:15
    2012年4月12日 上午 08:08

解答

  • 把 ' '改成  [ ] 試試.

    而且, 其實不用這麼麻煩 .  你可以看看這個做法 [以 DataAdapter 更新資料來源 (ADO.NET)]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 C.Kevin 2012年4月13日 上午 12:17
    2012年4月12日 上午 09:21

所有回覆

  • Jet Provider的參數好像是要用問號來表示,或許你可以參考下面這篇文章。

    http://www.mikesdotnetting.com/Article/26/Parameter-Queries-in-ASP.NET-with-MS-Access


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    • 已標示為解答 C.Kevin 2012年4月12日 上午 09:06
    • 已取消標示為解答 C.Kevin 2012年4月12日 上午 09:09
    2012年4月12日 上午 08:47
  • 找到錯誤點了,

    Update User_Info set ' " & ColumnHeaderCell & " ' = @NewValue Where ' " & ColumnHeaderCell & " ' = @OldValue" 

    語句中「欄位為變數」那邊錯了,請問怎麼樣才可以讓欄位可以由變數來指定呢?

    以為剛剛試出來了,問題出在「欄位是變數」..

    • 已編輯 C.Kevin 2012年4月12日 上午 09:10
    2012年4月12日 上午 09:00
  • 把 ' '改成  [ ] 試試.

    而且, 其實不用這麼麻煩 .  你可以看看這個做法 [以 DataAdapter 更新資料來源 (ADO.NET)]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 C.Kevin 2012年4月13日 上午 12:17
    2012年4月12日 上午 09:21
  • 成功了,~~~~謝謝 Bill。

    "Update User_Info set [" & ColumnHeaderCell & "] = @NewValue Where [" & ColumnHeaderCell & "] = @OldValue"

    您建議 DataAdapter 的方法我試試看。
    • 已編輯 C.Kevin 2012年4月13日 上午 12:34
    2012年4月13日 上午 12:18