2016-06-21 48 views
0

我有一個函數可以將數據從SQL數據庫綁定到gridview。到目前爲止,它的工作以及使用這樣的:IDataAdapter和基本命令(插入,更新,刪除)

Dim dad As SqlDataAdapter 
    Dim bs As BindingSource 
    Dim dtb As DataTable 
    Private Sub getDataSQL(ByVal selectCommand As String, ByVal connectionString As String) 
     dtb = New DataTable 
     Dim cnn As New SqlConnection(connectionString) 
     cnn.Open() 
     dad = New SqlDataAdapter(selectCommand, cnn) 
     Dim basiccommands = New SqlCommandBuilder(dad) 
     dad.InsertCommand = basiccommands.GetInsertCommand 
     dad.UpdateCommand = basiccommands.GetUpdateCommand 
     dad.DeleteCommand = basiccommands.GetDeleteCommand 
     dad.Fill(dtb) 
     bs = New BindingSource 
     bs.DataSource = dtb 
     navigator_main.BindingSource = bs 'this is a binding navigator 
     dgv_main.DataSource = bs 'this is the main datagridview 
     cnn.Close() 
    End Sub 

當用戶添加/編輯/刪除行我打電話:

bs.EndEdit() 
dad.Update(dtb) 

現在我必須重用的getData功能通過連接到不同的填充gridview的數據庫類型(主要是MySQL,ODB,SQL)。爲此,我創建了一個接口,它允許通過指示連接類型重複使用很多功能:

Public Interface IDataBaseHelper 
    Function openConnection(ByVal conn_string As String) As Boolean 
    Function executeQuery(ByVal query As String) As IDataReader 
    Function executeQuery(ByVal command As IDbCommand) As IDataReader 
    Function executeNonQuery(ByVal query As String) As Integer 
    Function createSQLCommand(ByVal query As String) As IDbCommand 
    Function getDataAdapter(ByVal query As String) As IDataAdapter 
    Sub closeConnection() 
End Interface 

新功能看起來是這樣的:

Private mBindingSource As New BindingSource() 
    Private mDataAdapter As IDataAdapter 
    Private mDataSet As DataSet 
    Private Sub getData(ByVal selectCommand As String, ByVal connectionString As String, ByVal connectionType As String) 
     'Connection types are defined in FDataBaseHelper: FDataBaseHelper.SQLSERVER_ .MYSQL_ .ODBC_ 
     Dim cnn = FDataBaseHelper.createInstance(connectionType) 
     cnn.openConnection(connectionString) 
     mDataAdapter = cnn.getDataAdapter(selectCommand) 
     mDataSet = New DataSet() 
     Dim dtb As New DataTable 
     mDataAdapter.Fill(mDataSet) 
     dtb = mDataSet.Tables(0) 
     mBindingSource.DataSource = dtb 
     navigator_main.BindingSource = mBindingSource 
     dgv_main.DataSource = mBindingSource 
    End Sub 

其中CLASE FDataBaseHelper樣子:

而getDataAdapter函數(例如,對於DataBaseHelperSQL)爲:

Public Function getDataAdapter(query As String) As IDataAdapter Implements IDataBaseHelper.getDataAdapter 
     Dim command = createSQLCommand(query) 
     Dim adapter = New SqlDataAdapter(command) 
     Return adapter 
    End Function 

datagridview會很好地填充,但用戶所做的任何更改都不會存儲在數據庫中。問題是,IDataAdapter不具有的InsertCommand,的UpdateCommand和DeleteCommand會員,並且我在得到一個錯誤:

mAdapter.Update(mDataSet) 

錯誤說:「更新需要通過時,一個有效的InsertCommand的DataRow集合與新行」 我嘗試了幾個建議的解決方案,但無濟於事,因爲我沒有找到任何人使用接口進行此操作。 任何幫助將不勝感激

編輯:最後,解決方案就像移動輔助類中的基本命令的定義一樣簡單。例如。爲DataBaseHelperSQL的getDataAdapter方法手段:

Public Function getDataAdapter(query As String) As IDataAdapter Implements IDataBaseHelper.getDataAdapter 
     Dim command = createSQLCommand(query) 
     Dim adapter = New SqlDataAdapter(command) 
     Dim basiccommands = New SqlCommandBuilder(adapter) 
     adapter.InsertCommand = basiccommands.GetInsertCommand 
     adapter.UpdateCommand = basiccommands.GetUpdateCommand 
     adapter.DeleteCommand = basiccommands.GetDeleteCommand 
      Return adapter 
End Function 
+0

有上下文丟失了相當數量,但爲了「記住」的各種DBCommands,DataAdapter的需要保留(如第一塊),你的' getDataAdapter'方法創建一個'New SqlDataAdapter',它沒有任何東西,但我不確定這種事情有多「有用」是有幾個原因的:主要是這裏有更多的代碼,而不僅僅是直接使用數據庫提供者;也有一些處置問題。 – Plutonix

+0

所以你的意思是直接使用提供者會更好?我真的很想保持界面。我知道代碼變得更加模糊,但我試圖建立一個具有一般功能的自定義控件,而不管數據庫的類型如何。儘管如此,我還是會再考慮一下。謝謝! –

+0

另一種選擇是爲應用程序構建一個配置的數據適配器以供用戶控件使用。問題仍然是每個數據庫提供商都有些偏僻。例如MySQL會重新打開你的連接,而不是OleDB和ODBC – Plutonix

回答

0

最後將溶液作爲移動助手類內的基本命令的定義一樣容易。例如。對於DataBaseHelperSQL的getDataAdapter方法表示:

Public Function getDataAdapter(query As String) As IDataAdapter Implements IDataBaseHelper.getDataAdapter 
     Dim command = createSQLCommand(query) 
     Dim adapter = New SqlDataAdapter(command) 
     Dim basiccommands = New SqlCommandBuilder(adapter) 
     adapter.InsertCommand = basiccommands.GetInsertCommand 
     adapter.UpdateCommand = basiccommands.GetUpdateCommand 
     adapter.DeleteCommand = basiccommands.GetDeleteCommand 
      Return adapter 
End Function