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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

2227閲覧

OdbcDataAdapter.Fill を数百回行うとエラーが発生します

xax

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2018/06/28 04:59

C#でMDBよりデータを取得するため、「OdbcDataAdapter.Fill」を使用していますが、ループにより600回ぐらい行うとエラーが発生しています。
以下に情報を記載しますので、ヒントがありましたらご教授お願いします。

C#

1var conString = $"Driver={{Microsoft Access Driver (*.mdb, *.accdb)}};" + 2 $"Dbq=Test.mdb;Uid=admin;Pwd=; ConnectTimeout=0;"; 3using(var con = new OdbcConnection(conString)) 4{ 5 con.Open(); 6 7 for (int i = 0; i < 1000; i++) 8 { 9 var table = new DataTable(); 10 11 var sql = "SELECT * FROM sample_table;"; 12 using (var adapter = new OdbcDataAdapter(sql, con)) 13 { 14 adapter.Fill(table); 15 } 16 17 System.Diagnostics.Debug.WriteLine($"{i}"); 18 } 19}

adapter.Fill(table);

こちらの環境では、600回を超えたあたりで、この部分でエラーが発生しています。


con.Open();

ここの「Open」を以下に変更して、「OdbcDataAdapter」で Open させた場合は、正常に終了しました。

con.Connection();

ただ、この場合だと、パフォーマンスが悪くなるので、できれば Open して動作させたいと考えております。


エラー
メッセージ: テスト メソッド Test が例外をスローしました:
System.Data.Odbc.OdbcException: ERROR [HY001] [Microsoft][ODBC Microsoft Access Driver] これ以上テーブルを開くことはできません。


開発環境

Visual Studio 2017 Community C#
.Net Framework 4.7.1

MDB:Access 2010

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

メッセージの通りです。
一度に全部開かないと駄目なんですか?

select文でテーブルを結合するとか、目的に応じて開くテーブルを限定するしか無いかと思います。
そのような作りであれば、メモリーの無駄遣いだと感じます。

※そもそものサンプルソースは同じSQLなので、意味があるものとは思いませんが。

投稿2018/06/28 05:11

編集2018/06/28 05:16
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xax

2018/06/28 05:28

言葉足らずで申し訳ありません、本来はSQL文のWHERE式を変更して処理しています。 WHERE式を少しずつ変更させながらループ処理を行っていたのですが、エラーが発生したので、最小限のソースコードを提示させて頂きました。 sazi様のご指摘どおり、目的に応じた処理を検討いたします。
sazi

2018/06/28 05:33

ループを抜けたら処理が終わりなら、 var table = new DataTable(); の部分をループの外側に記述すれば、開くレコードセットは一つで、使い回しができるようになります。
xax

2018/06/29 00:20

ご指導ありがとうございます。 y_waiwai様のご指摘もありましたが、DataTableの使い方に問題があったようです。 DataTableの使い方も合わせて、処理を見直します。
guest

0

var table = new DataTable();

fillよりも、600個Datatableを生成してるほうが問題なのでは

投稿2018/06/28 05:06

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xax

2018/06/28 05:21

ご連絡ありがとうございます。 DataTable については、考慮できておりませんでしたので、以下のように解放をつけて見ましたが 結果は変わりませんでした。 using (var adapter = new OdbcDataAdapter(sql, con)) { using (var table = new DataTable()) { adapter.Fill(table); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問