質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

Visual Basic 2010 で Access2010 を利用するアプリの制作

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 12K+

ky_46

score 89

社内で使用するデータベースを利用したアプリケーションを自作しています。

例としては、日々の販売データがAccess2010に蓄積されていて、それを集計して表示するようなイメージです。

この際、Access2010に接続して、データをセットして受け取る方法に、次のようなコードを使用しています。

        Dim dbini As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[Access2010のaccdbをフルパスで記入];"
        Dim reader As System.Data.OleDb.OleDbDataReader
        Dim command As System.Data.OleDb.OleDbCommand
        Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection(dbinf)
        cn.Open()

        Dim sql1 As String = "[SELECT文]"

        command = cn.CreateCommand
        command.CommandText = sql1
        reader = command.ExecuteReader()

        If reader.HasRows = True Then
            While reader.Read()
                ' レコードが取得できた時の処理

            End While
        Else
            ' レコードが取得できなかった時の処理
        End If

        ''データベースからのデータ書き込み終了
        reader.Close()
        cn.Close()

データが正常に取れるので、最初は余り気にしていなかったのですが、要求に応えて機能を増やしていった結果、ボタンが増えたり、プログラムが複雑化するにつれ、Accessからデータを引き出す度、上記のコードが必要になって、少々面倒に思えてきました。

そこで上記のSQL問い合わせコードをModuleなどに起き、各機能からSQL文を引き渡して、レコードの結果を得る事ができないか? と考えています。

しかし、いろいろGoogleで調べた所では、ADODB.Recordsetのような、データベースから得られた結果セットをそのまま保存して引き渡す機能を見つける事ができず、頓挫しています。

配列にして引き渡すにも、readerを使う方法では、レコード数が得られないため、配列を再定義できず、予め同じレコード数が帰ってくると判っていなければできないようです。

異なるフィールド数やレコード数が出るSQLを引き渡しても、結果セットを得られるなにか良い方法がありましたら教えてください。

実は、元々業務アプリはExcelVBAで作成していまして、Excelを立ち上げ、シートは一切使用せず、Auto_Openでフォームを立ち上げて処理をするというヘンな作業を行っていました。
これが少々複雑かつ、いちいちEXCEL起動するのが面倒という事になり、Visual Basic 2010へ移植を図っています。

参考になるかどうかですが、Accessと接続する場合はこのようなコードでした。

Public myConn As New ADODB.Connection
Public myRS As New ADODB.Recordset

 myConn.Open ConnectionString:= "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[Access2010のaccdbをフルパスで記入];"

 Dim sql1 As String = "[SELECT文]"

  myRS.Open Source:=sql1, ActiveConnection:=myConn

  Do Until myRS.EOF = True
    myRS.MoveNext
  Loop
ExcelVBAでは、あまり複雑な事をやろうとは思わなかったので、Accessのデータが必要な場所場所に記述していました。

よろしくお願いいたします。

htsignさま、ご回答ありがとうございました。
ベストアンサーにさせていただきました。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[Access2010のaccdbをフルパスで記入];"
Dim query As String = "[SELECT文]"

Dim dt As New DataTable()

Using da As New OleDbDataAdapter(query, connectionString)
    da.Fill(dt)
End Using
Dim result As DataRow() = dt.Select()
お望みの結果になりますでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/22 16:16

    ありがとうございます。

    頂いたコードを次のようにしたところ、希望通りの結果になりました。

    -------------
    Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim dTb1 As DataTable

    dTb1 = test("SELECT * FROM 売上データ ORDER BY 日付;")

    For Each DRow As DataRow In dTb1.Rows
    For i As Integer = 0 To dTb1.Columns.Count() - 1
    Debug.Write(DRow.Item(i) & ControlChars.Tab)
    Next
    Debug.Write(ControlChars.CrLf)
    Next
    MsgBox("完了", MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, "通知")
    End Sub
    End Class

    Module Module1
    Function test(ByVal query As String) As DataTable

    Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[Access2010のaccdbをフルパスで記入];"
    Dim dt As New DataTable()

    Using da As New OleDbDataAdapter(query, connectionString)
    da.Fill(dt)
    End Using

    Return dt

    End Function
    End Module

    -------------

    設定したボタンをクリックすると、確かに売上データデーブルが日付順でイミディエイトに表示されました。

    プログラムの各処理では必要なSQLを作成し、受け取るデータテーブルを用意すれば、希望の動作になりそうです。

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

    他にご回答なかったら、ベストアンサーにさせていただきます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる