vb2008です。
同じデータベースの2つのテーブルを同時に開けたいので、いろいろコーティングしてみたのですが、どうもうまく動きません。
Dim oConn As New System.Data.OleDb.OleDbConnection()
Dim oCommand As New OleDbCommand()
Dim oDataAdapter As New OleDbDataAdapter()
Dim MayakuDataSet As New DataSet()
Dim MoDataAdapter As New OleDbDataAdapter()
Dim MMDataSet As New DataSet()
データセットとデータアダプタは2つ作ってみました。多分、必要かな。と思って。
Table1の値を参考に、Table2のデータを処理したいのですが、うまくおごきません。
MMDataSet.Tables("mdata").Rows.Count
の値も0や、2と変わるはずなのですが、ずっと2のままであったり、
データベースをクローズしても同じです。
多分、基本を理解してないのでしょう。
アドバイスをお願い申し上げます。
今できている「ひとつのテーブルを開く」と同じことを別のテーブルに実行すればいいはずですが・・・
現在できている「テーブルを開く」というのはどのようにやっていますか?
#DataSetは複数のDataTableを持つことができます。
うまく説明できないので、コードを記述させてください。
Dim oConn As New System.Data.OleDb.OleDbConnection()
Dim oCommand As New OleDbCommand()
Dim oDataAdapter As New OleDbDataAdapter()
Dim MayakuDataSet As New DataSet()
Dim MoDataAdapter As New OleDbDataAdapter()
Dim MMDataSet As New DataSet()
Dim h As Integer
Dim i As Integer
Dim j As Integer
Dim dfsworks As String
Dim dfiworks As Integer
Dim dcworks As String
Dim roadData(0 To 3) As String
Dim listData(0 To 3) As String
Dim listLine As String
Try
'DB接続文字列の設定
oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\Mayaku\Data\Mayaku.mdb"
'コネクションの設定
oCommand.Connection = oConn
'DB接続を開く
oConn.Open()
'SQL文の設定
Const strSelect As String = "SELECT * FROM dmaster ORDER BY name"
oCommand.CommandText = strSelect
'データを取得する
oDataAdapter.SelectCommand = oCommand
oDataAdapter.Fill(MayakuDataSet, "dmaster")
'リストボックスに部門名を表示する設定
Me.ListBox1.Items.Clear()
For i = 0 To MayakuDataSet.Tables("dmaster").Rows.Count - 1
daworks1 = MayakuDataSet.Tables("dmaster").Rows(i).Item("dname")
dfiworks = CInt(Trim(MayakuDataSet.Tables("dmaster").Rows(i).Item("dfcount")))
dcworks = Trim(MayakuDataSet.Tables("dmaster").Rows(i).Item("dcode"))
'SQL文の設定
Const strSelect1 As String = "SELECT * FROM mdata WHERE dcode = @minID ORDER BY mainkey"
oCommand.CommandText = strSelect1
oCommand.Parameters.Add(New OleDbParameter("@minID", OleDbType.Char, 20))
oCommand.Parameters("@minID").Value = Trim(dcworks)
'データを取得する
MoDataAdapter.SelectCommand = oCommand
MoDataAdapter.Fill(MMDataSet, "mdata")
If MMDataSet.Tables("mdata").Rows.Count = 0 Then
'daworks2 = MMDataSet.Tables("mdata").Rows(i).Item("dname")
oCommand.Clone()
Else
For j = 0 To MMDataSet.Tables("mdata").Rows.Count - 1
If Trim(MMDataSet.Tables("mdata").Rows(j).Item("skubun")) = "0" Then
dfiworks = dfiworks - CInt(Trim(MMDataSet.Tables("mdata").Rows(i).Item("dsuu1")))
End If
If Trim(MMDataSet.Tables("mdata").Rows(j).Item("skubun")) = "1" Then
dfiworks = dfiworks + CInt(Trim(MMDataSet.Tables("mdata").Rows(i).Item("dsuu2")))
End If
If Trim(MMDataSet.Tables("mdata").Rows(j).Item("skubun")) = "2" Then
dfiworks = dfiworks - CInt(Trim(MMDataSet.Tables("mdata").Rows(i).Item("dsuu3")))
End If
If Trim(MMDataSet.Tables("mdata").Rows(j).Item("skubun")) = "3" Then
dfiworks = dfiworks + CInt(Trim(MMDataSet.Tables("mdata").Rows(i).Item("dsuu4")))
End If
Next j
oCommand.Clone()
End If
dfsworks = CStr(dfiworks)
roadData(0) = Trim(MayakuDataSet.Tables("dmaster").Rows(i).Item("dcode"))
roadData(1) = Trim(MayakuDataSet.Tables("dmaster").Rows(i).Item("dname"))
roadData(2) = Trim(dfsworks)
listData(0) = StrConv(LSet(Trim(roadData(0)), 13), VbStrConv.Narrow)
listData(1) = StrConv(LSet(Trim(roadData(1)), 12), VbStrConv.Wide)
listData(2) = StrConv(LSet(Trim(roadData(2)), 3), VbStrConv.Wide)
listLine = listData(0) & listData(1) & listData(2)
Me.ListBox1.Items.Add(listLine)
Next i
Catch oExcept As Exception
'例外が発生した時の処理
MessageBox.Show(oExcept.Message, "例外発生")
Finally
'DB接続を閉じる
If Not oConn Is Nothing Then
oConn.Close()
End If
End Try
MMDataSet.Tables("mdata").Rows.Countの値が変なんです。
#DataSetは複数のDataTableを持つことができます。
とありますが、Table1とTable2はどのように区別をつければよいのでしょうか?ここでは、dmaster mdata のテーブルですけど。
2つのテーブルを操作したことがありません。
どうか、よろしくアドバイスをお願い申し上げます。
今日、上記コードで、MMDataSetをすべて、同じMayakuDataSetに書き直してみましたが、結果は同じでした。
最初のループ iが0のときは、
MayakuDataSet.Tables("mdata").Rows.Count は2で正解です。
iが1の時は、
MayakuDataSet.Tables("mdata").Rows.Count は0でなくてはいけないのですが、結果は2のままで、きちんとRows.Countが収得できていません。
なぜだか、原因はわかりません。
DataSetの取り方がいけないのでしょうか?
それとも、他に原因があるのでしょうか?