C#でAccessのmdbを利用する方法について

このQ&Aのポイント
  • C#でMS-Accessのmdbに接続し、SQLを発行して結果を取得する方法について検証しています。
  • SQL発行後、結果の取得が遅い現象について、C#特有のものか、それともSQL発行後の結果取得方法が問題なのかを解説します。
  • OleDbDataAdapterを使用して結果を取得しているが、取得速度が遅い場合の対処方法についても説明します。
回答を見る
  • ベストアンサー

C#でのAccessのmdbの利用について

C#でMS-Accessのmdbに接続し、SQLを発行し取得しています。 接続文字列は Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False; Data Source=~ のようにしています。 SQL発行後、結果の取得が遅いのですが、mdbの結果取得が遅いという現象は、 C#特有のものなのでしょうか? もしくはSQLの発行後の結果取得の方法が問題なのでしょうか? <SQL発行部分(ロジック一部抜粋)> DataTable dt = new DataTable(); OleDbDataAdapter adapter = new OleDbDataAdapter(sqlCommand); adapter.Fill(dt); adapter.Dispose(); sqlCommand.Dispose(); ~中略~ return dt;

質問者が選んだベストアンサー

  • ベストアンサー
noname#212058
noname#212058
回答No.1

『C# 特有で遅い』とは、何を持って判断していますか? 1. 他の DBMS 製品 (例えば SQLServer) と比べて、MDB へのアクセスが遅い? 2. Access でクエリ実行した場合と比べてアクセスが遅い? 3. 何と比べたわけではなく、質問者さんの主観で遅いと思った 1. 3.の場合は、まずは Access 上での SQL の実行速度を測り、その上で『○倍遅くなった』という話をしてください。C# からの実行で Access 単体での速度を上回ることはありません。 2. の場合ですが、取得しようとしているデータの件数はどれくらいでしょうか? adapter.Fill(dt); (というか DataSet へのデータ投入) は、取得件数が5桁を超えると速度が極端に遅くなります (これは接続先が MDB でも SQLServer でも同じです)。数千件以上のデータを扱うのであれば、DataReader を使って取得したほうが良いです。 また、接続先の MDB ファイルが巨大である場合も、接続が遅くなります。この場合はデータを小分けするなり、MDB をあきらめて SQLite3 などのより高速なローカル用データベースを選択したほうが良いです。

okwave2015gift
質問者

お礼

お忙しい中、回答を頂きまして誠にありがとうございました。 メンテナンスのしやすさでアクセスMDBを選びましたが、SQLiteも検討しようと思います。ありがとうございました。

関連するQ&A

  • C#でアクセスに更新するときの文字の色&呼び出すときの文字の色

    はじめまして。今回質問させていただく内容は。 C#でSQL文によってACCESSに更新するとき、更新した文字を更新したとわかりやすくACCESSのテーブルに赤色で表示させたいのですが。 SQL文によってどのように文字の色を変化させて追加するのかわからずにいます。 そしてこのことが可能であるならば、ACCESSのテーブルをSQL文で呼び出しデータグリッドビューに表示させるときもACCESSのテーブルのレコードの文字の色もまるっきり同じに呼び出すことは可能でしょうか? 下記にSQLでアクセスに更新するプログラミングと呼び出すとき使ったプログラミングを記述しておきます。 もし可能なら方法などご回答いただけたら嬉しいです。 ACCESSのデータを更新するプログラム System.Data.OleDb.OleDbCommandBuilder cBuild; System.Data.OleDb.OleDbDataAdapter dAdp; DataSet dSet = new DataSet("t_作業実績"); DataTable dTbl; System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source =C:\\Documents and Settings\\05d9096\\デスクトップ\\MES.mdb;"); //データセットに取得する dAdp = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM 作業実績",cn); dAdp.Fill(dSet, "t_作業実績"); //コマンドビルダの作成 cBuild = new System.Data.OleDb.OleDbCommandBuilder(dAdp); //データセットからテーブルを取得して更新する dTbl = dSet.Tables["t_作業実績"]; dTbl.Rows[num-1]["移動個数"] = textBox2.Text; dAdp.Update(dSet, "t_作業実績"); MessageBox.Show("ok"); ACCESSからデータグリッドビューへ呼び出すプログラム System.Data.OleDb.OleDbDataAdapter dAdp; DataSet dSet = new DataSet("作業実績"); System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=C:\\Documents and Settings\\05d9096\\デスクトップ\\MES.mdb;"); //C:\\Documents and Settings\\05d9096\\デスクトップ\\MES.mdb //datasetに取得し、DATAGRIDVIEWに関連ずけする dAdp = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM 作業実績", cn); dAdp.Fill(dSet, "作業実績"); dataGridView2.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray; dataGridView2.DataSource = dSet.Tables["作業実績"];

  • VB2010とアクセスの接続方法

    textboxにID入力し、ENTERを押したらそのIDのデータがアクセスのデータベースから出力される、というプログラムを書き方のヒントを教えていただけないでしょうか。 Imports System.Data.OleDb Public Class Form1 Private Sub Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Enter '▼データの取得 Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Database\Animals.mdb") Dim SQLCm As OleDbCommand = Cn.CreateCommand Dim Adapter As New OleDbDataAdapter(SQLCm) Dim Table As New DataTable SQLCm.CommandText = "SELECT * FROM T_akusesu" Adapter.Fill(Table) '▼データの連結 textbox.DataBindings.Add("Text", Table, "名前") textbox2.DataBindings.Add("Text", Table, "フリガナ") Table.Dispose() Adapter.Dispose() SQLCm.Dispose() Cn.Dispose() End Sub End Class ・アクセスデータ  ID、名前、氏名 以上、よろしくお願い致します。

  • .NET MDBデータベース更新について質問です

    DataGridViewで表示するところまでできたのですが DataGridView上で編集したものを更新ボタンで MDBデータベースに上書き保存という形で 行いたいのですがいろいろ調べてもわかりませんでした。 VBを初めて日が浅いのでこつこつ勉強中なのですが 業務上の都合でDBの作成を行っています。 基本的に書き直したもの 'データベース取得 Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=保存場所" ) Dim Cm As OleDbCommand = Cn.CreateCommand Dim Adapter As New OleDbDataAdapter(Cm) Dim Table As New DataTable Cn.Open() Cm.CommandText = "SELECT * FROM Aテーブル" Adapter.Fill(Table) DataGridView1.DataSource = Table DBにはこのように接続しております。 ここまでも手探りで行ったので熟練の方から見ればへんかもしれませんが指導おねがいします。

  • C# OleDb SQL JOIN すると例外

    ================================== <テーブルA> TagNo(整数) TagID(文字列) TagComment(文字列) <テーブルB> TagNo(整数) GroupNo(整数) ================================== のようなテーブルがあるとします。 これらのテーブルに対し、 下のようなプログラム(抜粋)を使い、 sqlでデータをselectする際、 joinを使うとエラーになります。 ================================== using System.Data; using System.Data.OleDb; dataTbl = new DataTable(); OleDbCommand sqlCommand = new OleDbCommand(sql, ConnectionObj, TransactionObj); using (OleDbDataAdapter adapter = new OleDbDataAdapter(sqlCommand)) {   adapter.Fill(dataTbl);   adapter.Dispose();   sqlCommand.Dispose(); } for (int i = 0; i < dataTbl.Rows.Count; i++) {   DataRow dtRow = dataTbl.Rows[i];   int tagNo = Convert.ToInt32(dtRow["TagNo"]); } ================================== 具体的には、 (1)テーブルAのみをselectすると問題なし。  sql = "select * from A order by A.TagNo asc"; (2)joinを使ってテーブルAとテーブルBを読み込むと例外が発生する。  sql = "select * from A left join B on A.TagNo = B.TagNo order by A.TagNo asc"  dtRow["TagNo"] のように列名でアクセスすると例外が発生する。  エラーの内容:{"列 'TagNo' はテーブル に属していません。"}  (「テーブル」と「に」の間の空白が気になりますが...。)  エラーコード 80070057  但し、dtRow[0] のようにインデックスでアクセスすると値を取り出せます。 そういうものなのでしょうか? 列名でアクセスできないのでしょうか? やり方が間違いでしょうか? 困っております。 ご存知の方、情報をいただければと思います。 よろしくお願い致します。 (環境) DB:Microsoft.Jet.OLEDB.4.0(Access mdb) OS:win7 pro 64 sp1 C#:Microsoft Visual Studio 2012

  • Datasetの非接続(C#)※初心者

    C#でプログラム開発をしています。 Accessのデータをお客様に配布したくないため、メモリ上にDataSetで取り込めばよいと上司から言われました。 そこでお聞きしたいのですが、下記のようにDataSetでAccessからデータを取り込み、メモリ上に保持はできたのですが、これをデータ接続せずに、再びデータを参照することはできるのでしょうか? // データ元のmdbファイル DataTable dataTable1; DataSet dataSet1 = new DataSet(); OleDbDataAdapter dataAdapter1 = new OleDbDataAdapter( "SQL文", "mdbファイルのパス" ); // データ取得 dataAdapter1.Fill( dataSet1 ); dataTable1 = dataSet1.Tables[0]; お手数ですが、どうか教えてください。

  • Vb2010にアクセスのデータを出力

    前回、似たような質問をさせて頂いたのですが、私の説明が悪く、解決には至らなかったので、再度練った説明で質問させていただきます。 ・visual basic 2010 設置コントロール TextBox1、TextBox2、TextBox3 Button1 ・アクセスのテーブル  ID(数字)、氏名(テキスト)、性別(テキスト) TextBox1にアクセスのID入力し、その横に設置したButtomを押したら、そのIDのデータ(名前、性別)がTextBox2,TextBox3に出力される、というプログラムを書き方のヒントを教えていただけないでしょうか。 Imports System.Data.OleDb Public Class Form1 Private Sub Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Enter '▼データの取得 Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Database\Animals.mdb") Dim SQLCm As OleDbCommand = Cn.CreateCommand Dim Adapter As New OleDbDataAdapter(SQLCm) Dim Table As New DataTable SQLCm.CommandText = "SELECT * FROM T_akusesu" Adapter.Fill(Table) '▼データの連結 textbox.DataBindings.Add("Text", Table, "名前") textbox2.DataBindings.Add("Text", Table, "性別") Table.Dispose() Adapter.Dispose() SQLCm.Dispose() Cn.Dispose() End Sub End Class また、Buttonのイベントには何を書くべきなのでしょうか? 以上、よろしくお願い致します。

  • VB2013でVB6でのDBは利用可能?

    VB4.0で作成してましたMicrosoft.Jet.OLEDB.4.0のDBをSQLSERVER2012で作成したDBに移行したいのですが VB2013では読み込めないのでしょうか? データーベースエクスプローラーでは中身の確認はできるのですが プログラムで走らせるとSqlDataAdapter(sql, cnStr)のところでエラー下記[エラー結果]とになります Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim cnStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\SERVER\DB名.mdb" Dim sql As String sql = "SELECT * FROM テーブル名" Dim dt1 As New DataTable Dim da1 As New SqlDataAdapter(sql, cnStr) Try da1.Fill(dt1) DataGridView1.DataSource = dt1 Catch ex As Exception End Try End Sub [エラー結果] 型 'System.ArgumentException' のハンドルされていない例外が System.Data.dll で発生しました 追加情報:キーワードはサポートされていません : 'provider' 以前のmdbファイルが読み込める方法はないのでしょうか?

  • VB.netでJet.OLEDBを使いCSVを読み

    VB.netでOleDbConnectionを使ってCSVを読み込むと便利ですが、属性判定を勝手にされたくありません。 どうすればコントロールできますか? 個別に属性を決めるか、もしくは全部文字列として受け取りたいです。 何もしなければ、項目の属性が自動で決まりますが、その属性判断が甘く、属性に合わない値が消えます。 例えば、 日付項目っぽい値が入っている項目にたまに文字列がるとすると、 その項目が日付項目になって、日付項目に合わないデータは空白になってしまいます。 CSVの読み込みは一旦すべて文字列にして受け取り、その後の事はアプリでコントロールしたいです。 どうすればできますか? Dim OleDbConnection1 As New OleDb.OleDbConnection Dim OleDbCommand1 As New OleDb.OleDbCommand Dim OleDbDataAdapter1 As New OleDb.OleDbDataAdapter Dim FileInfo1 As New FileInfo(CSVファイルの名前をフルパスで) OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & FileInfo1.DirectoryName & "\;" _ & "Extended Properties=" & ControlChars.Quote & "Text;HDR=No;FMT=Delimited" & ControlChars.Quote OleDbConnection1.Open() OleDbCommand1.CommandText = "SELECT * FROM [" & FileInfo1.Name & "]" OleDbCommand1.Connection = OleDbConnection1 OleDbDataAdapter1.SelectCommand = OleDbCommand1 OleDbDataAdapter1.Fill(DataTable1) OleDbDataAdapter1.Dispose() OleDbCommand1.Dispose() OleDbConnection1.Dispose()

  • GridViewのデータソースの入れ方がわかりません

    OleDb.OleDbDataAdapter' が定義されていません DataSet' が定義されていません。 OleDb.OleDbConnection' が定義されていません。 OleDb.OleDbDataAdapter' が定義されていません 以上の エラーが出ます 定義の、意味がわかりません 教えてください お願いします WinXP Microsoft Visual Web Developer 2008 ASPX Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("顧客台帳") Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\*******\*****.mdb;") 'データセットに取得し、DataGridViewに関連付ける dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 顧客台帳", cn) dAdp.Fill(dSet, "顧客台帳") Me.GridView1.DataSource = dSet.Tables("顧客台帳") End Sub

  • データセットへの取得について

    VB2005はじめたばかりです。 MDBからデータを抽出してデータセットへのところでエラーとなります。 Private Sub Button1_Click Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("t_社員") Dim cn As OleDb.OleDbConnection _ = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2005\SampleDB.mdb;") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 社員 where 社員番号=>101", cn) dAdp.Fill(dSet, "t_社員") ★ここでエラーとなってしまいます。【where 社員番号=>101", 】をトルと正常となります。 恐れ入りますがご指摘いただけますでしょうか。

専門家に質問してみよう