私は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)
今、私は違うと接続してのGridViewを移入したgetData関数を再利用する必要がありますデータベースの種類(主に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
新機能は次のようになります。
CLASE FDataBaseHelperがどのように見える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
:
そして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はうまく読み込まれますが、ユーザーが行った変更はデータベースに保存されません。エラーが言う
mAdapter.Update(mDataSet)
:「新しい行を含むDataRowコレクションが渡されたときの更新が有効InsertCommandはを必要とし、」問題は、IDataAdapterがメンバーとしてInsertCommandは、UpdateCommandのとDeleteCommandのを持っていない、と私はエラーを取得していますということです 私はいくつかの提案された解決策を試しましたが、インタフェースを使用している人はいませんでしたので、役に立たないと思います。 助けを歓迎します
EDIT:最終的には、ヘルパークラスの中で基本コマンドの定義を動かすほど簡単でした。例えば。 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を「記憶」するためには、データアダプターは、(最初のブロックのように)永続化する必要があり、あなたの ' getDataAdapter'メソッドは 'New SqlDataAdapter'を作成しますが、これはまだ何もありません。このようなことがいくつかの理由で「役に立つ」かどうかはわかりません。主にDBプロバイダを直接使用するよりも多くのコードがあります。いくつかの処分問題もあります。 – Plutonix
プロバイダを直接使うほうがいいということですか?私は本当にインターフェイスを維持したいと思います。私は、コードが不明瞭になることを知っているが、私はDBの種類にかかわらず一般的な機能を持つカスタムコントロールを構築しようとしている。それにもかかわらず、私はそれをもう一度考えます。ありがとう! –
別の方法として、hist appが、使用するユーザーコントロールに構成済みのデータアダプターを構築することができます。問題は、各DBプロバイダが持っている小さな偏心です。例えばMySQLはOleDBとODBCではなく、あなたのために接続を再開するでしょう。 – Plutonix