2016-06-21 14 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) 

今、私は違うと接続しての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 
+0

あり不足している状況のかなりの量があるが、様々なDBCommandsを「記憶」するためには、データアダプターは、(最初​​のブロックのように)永続化する必要があり、あなたの ' getDataAdapter'メソッドは 'New SqlDataAdapter'を作成しますが、これはまだ何もありません。このようなことがいくつかの理由で「役に立つ」かどうかはわかりません。主にDBプロバイダを直接使用するよりも多くのコードがあります。いくつかの処分問題もあります。 – Plutonix

+0

プロバイダを直接使うほうがいいということですか?私は本当にインターフェイスを維持したいと思います。私は、コードが不明瞭になることを知っているが、私はDBの種類にかかわらず一般的な機能を持つカスタムコントロールを構築しようとしている。それにもかかわらず、私はそれをもう一度考えます。ありがとう! –

+0

別の方法として、hist appが、使用するユーザーコントロールに構成済みのデータアダプターを構築することができます。問題は、各DBプロバイダが持っている小さな偏心です。例えば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 
関連する問題