2016-06-21 77 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