- PR -

DataSourceの効果的な使用法

1
投稿者投稿内容
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2008-04-21 13:09
環境:Windows XP Home Edition
   Visual Studio 2005
DB :Access2000

VB.netを使用し、マスタのテーブルから取得したデータを、DataTable型で持ちコンボボックスのDataSourceに設定し、別のテーブルへ選択されたデータを登録する処理を作ろうとしています。

フォーム上には上記コンボボックスを6つ用意し(DataSourceは同一のマスタから取得)、それに1つずつ対応するコンボボックスをさらに6つ用意し(別のマスタからDataSourceを取得)、それぞれのコンボボックスで選択されたデータを6レコード、ワンアクションで登録するつもりなのですが、現在考えている処理より効率よく行う事が出来ないか質問させてください。



コンボボックスは以前こちらで質問させていただいた、コントロールの配列を使用する方法を用い
cboA=New ComboBox(){cboA1,cboA2,cboA3,cboA4,cboA5,cboA6}
cboB=New ComboBox(){cboB1,cboB2,cboB3,cboB4,cboB5,cboB6}
の2つの配列をモジュールレベルで宣言し作成しています。

そして、マスタAのデータをcboAのアイテム、マスタBのデータをcboBのアイテムとして、選択されたデータを別のテーブルに登録します。

そのcboA、cboBのアイテムを設定する所になるのですが、以下の現在考えているロジックで行うと、マスタへのアクセス数が合計12回になる為処理が多少遅く感じます。

以下現在のロジック

Private Sub setCommboBox()
 Dim SQLCm As OleDbCommand = clsDbCon.pdbcn.CreateCommand
 Dim Adapter As New OleDbDataAdapter(SQLCm)
 Dim strSQL1, strSQL2 As String
 Dim intCnt As Integer
 Dim Table1(0 To 5), Table2(0 To 5) As DataTable

 'マスタA
 strSQL1 = "SELECT DATA_A1, DATA_A2 FROM M_A "

 'マスタB
 strSQL2 = "SELECT DATA_B1, DATA_B2 FROM M_B "

 For intCnt = 0 To 5
  'テーブルの宣言
  Table1(intCnt) = New DataTable
  Table2(intCnt) = New DataTable
  'マスタAのSQL文のセット
  SQLCm.CommandText = strSQL1
  '実行
  Adapter.Fill(Table1(intCnt))

  'マスタBのSQL文のセット
  SQLCm.CommandText = strSQL2
  '実行
  Adapter.Fill(Table2(intCnt))

  'コンボにデータをセット
  cboA(intCnt).DataSource = Table1(intCnt)
  cboA(intCnt).DisplayMember = "DATA_A2"
  cboB(intCnt).DataSource = Table2(intCnt)
  cboB(intCnt).DisplayMember = "DATA_B2"
 Next

 '解放
 Adapter.Dispose()
 SQLCm.Dispose()
End Sub

DataTableの取得を2回だけにして、DataSourceをなんとか設定できないか試したのですが、そういう処理を見つけることができませんでした。

試したことは

Table1とTable2をそのままデータソースに入れると、それぞれが全のコンボボックスが、同一データソースと言う事で連動して動く

それならと思い、Table1とTable2を配列にして、Adapter.Fill(Table1(0))でtable1(0)にデータを取得した後
Table1(1) = Table1(0)と言った形で、データソースを別にしたつもりの処理を考えたのですが
同一のデータソースと言う形で1つのコンボを選択すると他の同一アイテムのコンボも連動して変更されるという状態で諦める

と言う状態です。



以前質問させていただいた時から、.netを離れ別のVB6やJava、ASPなどの業務を行っていた為、.netに関する知識はそれほど成長出来ていない現状で申し訳ない上に
わかりづらいところも多々あるかと思いますが、DataSourceに限らず何か良い実現方法が有ればアドバイスいただけたら助かります。

よろしくお願いいたします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-04-21 14:12
引用:
Table1とTable2をそのままデータソースに入れると、それぞれが全のコンボボックスが、同一データソースと言う事で連動して動く

試してないですが、同じインスタンスだから連動すると考えればコピーしちゃえばいい気がします。

引用:
Table1(1) = Table1(0)と言った形で、データソースを別にしたつもりの処理を考えたのですが

これは同じものを参照させているだけです。
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2008-04-21 15:41
返信ありがとうございます。

おかげさまでコピーメソッドを使用しデータベースへのアクセスを2回に抑える事ができました。
こういう事に気付け無いことが恥ずかしい限りですが、今後に生かして勉強を進めて行こうと思います。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)