簡體   English   中英

更新數據綁定的DataGridView

[英]Updating A DataGridView That Is Databound

我有一個DataGridView數據綁定到數據集。 但是,我正在嘗試運行無數據源查詢並更新DataGridView以顯示查詢結果。

我使用的代碼是:

 Public Sub Call_Filter()

        Dim myCon = New OleDbConnection(My.Settings.Database_string)

        Try
            myCon.Open()
        Catch ex As Exception
            MsgBox("Sorry, An Error Occurred" & vbNewLine & _
                   "Database Not Found!" & vbNewLine & vbNewLine & _
                   "Error Message: " & ex.Message, MsgBoxStyle.OkOnly, "Could Not Locate Database")
            Main.VIEW_SavingMessage.Visible = False
            Exit Sub
        End Try

        Dim FilterAdaptor = New OleDbDataAdapter

        Dim FilterAdaptorText = "SELECT ID, [Name Of Person], [SAP Job Number], [Site Name], [Asset Description], [Spares Supplier], [Supplier Contact Name], [Supplier Contact Phone Number], " & _
                                  "[Supplier Contact Email], [Spares Description], [Part Number], [Quantity To Order], Cost, Comments, [Request Date], [Date Ordered], [Ordered By], [Invoice Received], " & _
                                  "[Invoice Paid], [Method Of Payment], [Date Item Received], [Quote Attatchment], [Marked As Urgent] " & _
         "FROM Spares " & _
         "WHERE ([Name Of Person] = @NameOfPerson OR @NameOfPerson = '' OR @NameOfPerson IS NULL) AND " & _
         "([SAP Job Number] = @SAPJobNo OR @SAPJobNo = '' OR @SAPJobNo IS NULL)"

        Dim FilteredDataSet = New DataSet

        Dim sqr As OleDbCommand = New OleDbCommand(FilterAdaptorText, myCon)

        sqr.Parameters.Add("@NameOfPerson", OleDbType.VarChar).Value = Main.Name_Of_PersonToolStripTextBox.Text
        If Main.FilterJobNo.Text <> "" Then
            sqr.Parameters.Add("@SAPJobNo", OleDbType.Integer).Value = Main.FilterJobNo.Text
        Else
            sqr.Parameters.Add("@SAPJobNo", OleDbType.Integer).Value = DBNull.Value
        End If

        Try
            sqr.ExecuteNonQuery()

        Catch ex As Exception
            MsgBox("Sorry, An error occured!" & vbNewLine & _
       "The database rejected the request" & vbNewLine & vbNewLine & _
       "Error Message: " & ex.Message, MsgBoxStyle.OkOnly, "Database Refused Query")
            Exit Sub
        End Try

        FilterAdaptor.SelectCommand = sqr
        FilterAdaptor.Fill(FilteredDataSet)
        Main.DataGridView1.DataSource = FilteredDataSet

        myCon.Close()

    End Sub

盡管此代碼可以正確執行,並且不會引發任何錯誤,但它會向DataGridView返回空白行,而不是正確的過濾結果。 我知道篩選器查詢可以正常工作,因為我已經通過Access測試了它,並且它返回了正確的信息。

我不能使用任何其他方法來執行此操作,因為我要執行的查詢很大,這只是用於測試的篩選查詢的一小部分。

看來我遇到的問題是試圖將過濾后的信息輸入到DataGridView 我缺少基本的東西嗎? 我已經設法以類似的方法從數據庫中插入,讀取和刪除數據庫,但這在使用WHERE命令時似乎不起作用。

更新-29/06/15

我仍在嘗試使其工作,但經過研究后,我的處理方式發生了變化:

 Public Function getDataSet() As DataSet
        Dim ds As New Data.DataSet
        ds.Tables.Add(New DataTable("Filtered"))


        Dim Con As New OleDb.OleDbConnection(My.Settings.Database_string)
        Con.Open()
        Dim ad As New Data.OleDb.OleDbDataAdapter("SELECT ID, [Name Of Person] " & _
     "FROM Spares " & _
     "WHERE [Name Of Person] = Joe", Con)

        ad.Fill(ds.Tables("Filtered"))

        Return ds
    End Function

現在發生的是我遇到以下錯誤:

沒有為一個或多個必需參數給出值。

但是我不明白這個所謂的“參數”是從哪里來的? 我沒有使用任何參數?

謝謝

您的查詢的WHERE子句錯誤。

"WHERE ([Name Of Person] = @NameOfPerson OR @NameOfPerson = '' OR @NameOfPerson IS NULL) AND 

由於參數/變量只是[Name of Person]一種條件。 它只能在WHERE中出現一次。 如果此人的名字是“ Bob”,則該部分將解析為:

"WHERE ([Name Of Person] = 'Bob' OR 'Bob'= '' OR 'Bob' IS NULL) AND ...

顯然,“ Bob”永遠不會為Null或'' 這些都應該是列名:

"WHERE ([Name Of Person] = 'Bob' OR [Name Of Person]= '' OR [Name Of Person] IS NULL) AND ...

[SAP Job Number]部分也是如此。

您似乎並沒有綁定數據。 設置數據源后,嘗試使用DataGridView1.Databind()

終於設法使用以下方法:

Public Function getDataSet() As DataSet
        Dim ds As New Data.DataSet
        ds.Tables.Add(New DataTable("Filtered"))


        Dim Con As New OleDb.OleDbConnection(My.Settings.Database_string)
        Con.Open()
        Dim ad As New Data.OleDb.OleDbDataAdapter




        Dim cmd As New OleDbCommand("SELECT * FROM Spares " & _
                                    "WHERE ([Name Of Person] = @NOP OR [Name Of Person] = '' OR [Name Of Person] IS NULL Or @NOP IS NULL) AND " & _
                                    "([SAP Job Number] = @SJN OR [SAP Job Number] = '' OR [SAP Job Number] IS NULL Or @SJN IS NULL)", Con)

        If Main.Name_Of_PersonToolStripTextBox.Text = "" Then
            cmd.Parameters.AddWithValue("@NOP", DBNull.Value)
        Else
            cmd.Parameters.AddWithValue("@NOP", Main.Name_Of_PersonToolStripTextBox.Text)
        End If

        If Main.FilterJobNo.Text = "" Then
            cmd.Parameters.AddWithValue("@SJN", DBNull.Value)
        Else
            cmd.Parameters.AddWithValue("@SJN", Main.FilterJobNo.Text)
        End If

        ad.SelectCommand = cmd
        ad.Fill(ds.Tables("Filtered"))


        Return ds
    End Function

並使用以下命令調用它:

Private Sub FILTER_Accept_Button_Click(sender As Object, e As EventArgs) Handles FILTER_Accept_Button.Click
        DataGridView1.DataSource = Database_Management_Codes.getDataSet().Tables(0)
    End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM