我有一个函数可以将数据从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
有上下文丢失了相当数量,但为了“记住”的各种DBCommands,DataAdapter的需要保留(如第一块),你的' getDataAdapter'方法创建一个'New SqlDataAdapter',它没有任何东西,但我不确定这种事情有多“有用”是有几个原因的:主要是这里有更多的代码,而不仅仅是直接使用数据库提供者;也有一些处置问题。 – Plutonix
所以你的意思是直接使用提供者会更好?我真的很想保持界面。我知道代码变得更加模糊,但我试图建立一个具有一般功能的自定义控件,而不管数据库的类型如何。尽管如此,我还是会再考虑一下。谢谢! –
另一种选择是为应用程序构建一个配置的数据适配器以供用户控件使用。问题仍然是每个数据库提供商都有些偏僻。例如MySQL会重新打开你的连接,而不是OleDB和ODBC – Plutonix