C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: mdb→SQL Server Compactの変換


(過去ログ 130 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■77233 / inTopicNo.1)  mdb→SQL Server Compactの変換
  
□投稿者/ クリス (1回)-(2015/09/29(Tue) 17:03:05)

分類:[データベース全般] 

こんにちは。どうぞお知恵をお貸しください。
今まで、配布してきたツール(VB2008で作成)で利用するDBとして
Accessのmdbファイル(Access2003の時代のもの)を使っていました。
使用方法としては、あらかじめ空のテーブルを構築したmdbをテンプレートとしてツール内に持たせ、
ユーザに任意の場所に保存してもらい、ユーザ側でこれを利用するというものです。

ただし、ユーザ側で追加したデータ件数が多くなってきたので、AccessのMDBの代わりに
VS2008に付属のSQL Server Compact 3.5を使おうと思います。
これに伴い、旧来からのユーザ用に、mdbファイルをSQL Server Compactのsdfファイルに変換できる
ツールを用意しようと思います。
ツールはVB2008で作成し、今考えている方法は、空のテーブルを構築したsdfファイルを用意し、
これにmdbファイルの内容を追加しようというものです。

そこで、まずは単純にmdbの各テーブルを読み込み、1行ずつsdfファイルにInsertを行ってみましたが、
行数の多い(30万件程)テーブルの場合、データ追加の最中に「この操作を完了するのに十分な記憶域がありません」
というエラーが出てしまいます。
タスクマネージャーを見ると、Insert実行中にメモリ使用量が上昇し、最終的に上記エラーが
発生していました。
途中でコネクションを切断すれば、メモリの上昇は抑えられるのですが、非効率な気がします。
また、完了までかなりの時間がかかりました。

そこで質問なのですが、もっと効率的にmdbファイルのデータを
SQL Server Compactのsdfファイルに追加する方法はないでしょうか?
VB側で利用可能な方法であれば問題ございません。

なお、mdb側の型とsdf側の型は一致するようにしていますが、mdbとsdfではテーブルのカラム名が異なります。
(mdbでは日本語のカラム名を使用しましたが、sdfではカラム名に日本語を使うのを止め、英字にしました。)

よろしくお願いします。
引用返信 編集キー/
■77235 / inTopicNo.2)  Re[1]: mdb→SQL Server Compactの変換
□投稿者/ 魔界の仮面弁士 (510回)-(2015/09/29(Tue) 18:40:50)
No77233 (クリス さん) に返信
> VS2008に付属のSQL Server Compact 3.5を使おうと思います。

Compact Edition では、使用可能な照合順序やデータ型が限定されていますのでご注意下さい。

たとえば、mdb の Local Identifier が 0x411 (日本語)であれば、
SQL Compact 3.5 では、Japanese_CI_AS を選ぶことができますが、
mdb の Local Identifier が 0x10411 (日本語Unicode)の場合、対応するものがありません。

Compact でない SQL Server であれば、Japanese_Unicode_CI_AS を選択できるのですけれども。



> 1行ずつsdfファイルにInsertを行ってみましたが、
INSER INTO [ODBC;……sdfへの接続情報……].[sdfのテーブル] (…列…) SELECT …列… FROM [mdbのテーブル]
を使って、まとめてエクスポートできるかも知れません。試していないですけど。


> ツールはVB2008で作成し、今考えている方法は、空のテーブルを構築したsdfファイルを用意し、
> これにmdbファイルの内容を追加しようというものです。
それで良いとおもいます。自分もそんな感じで対処しています。

<蛇足>
私の場合、"空の sdf" はファイルとしてではなく、exe の内部リソースに配置しています。

実行環境に sdf があればそれを使いますが、sdf が無い場合は、exe 内のリソースから
空の sdf をファイルとして吐き出し、そこに CREATE TABLE や INSERT INTO で
データを書き込んでいくと言う手法です。
(sdf を削除してしまうユーザーが居たので、再作成できるようにするための処置です)
</蛇足>


> 行数の多い(30万件程)テーブルの場合、データ追加の最中に「この操作を完了するのに十分な記憶域がありません」
> というエラーが出てしまいます。
1万件ごとに、トランザクションをコミットしてみたらどうでしょうか。
引用返信 編集キー/
■77236 / inTopicNo.3)  Re[2]: mdb→SQL Server Compactの変換
□投稿者/ クリス (2回)-(2015/09/29(Tue) 22:09:32)
No77235 (魔界の仮面弁士 さん) に返信

貴重なアドバイスありがとうございました。
勉強になります。

ところで、

>>1行ずつsdfファイルにInsertを行ってみましたが、
> INSER INTO [ODBC;……sdfへの接続情報……].[sdfのテーブル] (…列…) SELECT …列… FROM [mdbのテーブル]
> を使って、まとめてエクスポートできるかも知れません。試していないですけど。

上記を試してみたいのですが、具体的にどう書けばいいのでしょうか?
上記のSQLは、mdb側のコネクションに対するコマンドになるのでしょうか?
引用返信 編集キー/
■77243 / inTopicNo.4)  Re[3]: mdb→SQL Server Compactの変換
□投稿者/ 魔界の仮面弁士 (511回)-(2015/09/30(Wed) 12:54:21)
No77236 (クリス さん) に返信
> 上記のSQLは、mdb側のコネクションに対するコマンドになるのでしょうか?
そうです。

> 上記を試してみたいのですが、具体的にどう書けばいいのでしょうか?
とりあえず下記が参考になるかも。
http://www.ruriplus.com/msaccess/tch/tch_061.html
http://bbs.wankuma.com/index.cgi?mode=al2&namber=5404&KLOG=15

ODBC は、DSNを設定しておいてそれを指定するのが簡単ですが、
上記にあるように、Driver={ODBCドライバー名}を使えば、DSNレス接続も可能です。

構文の詳細については、Microsoft Access のマニュアルで確認してみて下さい。
引用返信 編集キー/
■77245 / inTopicNo.5)  Re[4]: mdb→SQL Server Compactの変換
□投稿者/ クリス (3回)-(2015/09/30(Wed) 15:00:04)
No77243 (魔界の仮面弁士 さん) に返信

情報ありがとうございます。

> ODBC は、DSNを設定しておいてそれを指定するのが簡単ですが、
> 上記にあるように、Driver={ODBCドライバー名}を使えば、DSNレス接続も可能です。

ただ、色々と調べてみると、SQL Server Compact用のドライバが無いようなのですが、
Driver={ODBCドライバー名}を指定できないと、DSNレス接続は不可能ということでしょうか?

引用返信 編集キー/
■77246 / inTopicNo.6)  Re[5]: mdb→SQL Server Compactの変換
□投稿者/ 魔界の仮面弁士 (512回)-(2015/09/30(Wed) 16:31:24)
No77245 (クリス さん) に返信
> ただ、色々と調べてみると、SQL Server Compact用のドライバが無いようなのですが、

………無さそうですね。

Microsoft OLE DB Provider for ODBCという、
「ODBC 接続用の OLE DB Provider」があるように、かつては
「OLE DB 接続用の ODBC ドライバー」を販売していたベンダーも
あったのですが、現行製品にはそれらしいものも見当たりませんし。


SQL Server Compact の代わりに、SQL Server Express を使う選択肢も
検討してみては如何でしょう。


> Driver={ODBCドライバー名}を指定できないと、DSNレス接続は不可能ということでしょうか?
DSNを指定するかどうかに関わらず、「ODBC 接続」を使うのであれば、ODBC ドライバーが必要ですね。


参考情報:Jet 4.0 のデータベースエンジンが扱えるデータソース
・Jet mdb (2.x, 3.x, 4.0)
・ODBC
・Exchange 4.0
・Excel (xls)
・Lotus 1-2-3 (WJ2, WJ3, WK1, WK3, WK4)
・Outlook (9.0)
・Paradox (3.x, 4.x, 5.x, 7.x)
・xBase
・Text
・HTML Table

※ 読込専用や出力専用の物も含む
引用返信 編集キー/
■77247 / inTopicNo.7)  Re[6]: mdb→SQL Server Compactの変換
□投稿者/ クリス (4回)-(2015/09/30(Wed) 17:50:05)
No77246 (魔界の仮面弁士 さん) に返信

情報ありがとうございます。
やはり、地道にSELECT&INSERTを繰り返す方法しかないようですね。

なお、SQL Server Expressについては、検討していません。
これは、ユーザ側でDBファイルを自由に移動・コピーできるようにするためです。


ところで、最初の質問で、メモリ不足のエラーが出たと申し上げましたが、
30万件程のテーブルのデータをDataAdapterを用いて一度にDataTable化したためのようでした。
(お恥ずかしい限りです・・・)
このテーブルは正規化されているため、親ID毎にSELECTして分割してINSERTを行ったら
メモリ不足は解消され、完了時間も短縮されました。

ところで、今回はmdbのデータを読み込んで新しいDBにINSERTする処理なのですが、
この場合、もしかしたら、DataAdapterでDataTable化するよりは、
DataReaderを使う方が適しているのでしょうか?
DataReaderは今まであまり使ったことがなかったのですが、
速度やメモリ使用の違いなどをアドバイス頂けるとありがたいです。
引用返信 編集キー/
■77249 / inTopicNo.8)  Re[7]: mdb→SQL Server Compactの変換
□投稿者/ 魔界の仮面弁士 (513回)-(2015/09/30(Wed) 19:31:10)
No77247 (クリス さん) に返信
> なお、SQL Server Expressについては、検討していません。
> これは、ユーザ側でDBファイルを自由に移動・コピーできるようにするためです。

アタッチされている最中でなければ、mdf でもコピーできますよ。たとえば接続文字列として、
 "Data Source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\database1.mdf;User Instance=true"
 "Data Source=(local);Integrated Security=SSPI;AttachDBFilename=C:\data\database1.mdf;User Instance=true"
などを使っている場合、アプリ起動中は database1.mdf がロックされますが、
アプリ終了後は、database1.mdf のコピーや上書きが可能です。


VB2008なら、「新しい項目の追加」画面から、プロジェクトにファイルを追加する際、
sdf を追加するための [データ]-[ローカル データベース]の代わりに、
mdf を追加するための [データ]-[サービス ベースのデータベース]が用意されています。
(この項目が、下位のエディションに含まれているのかどうかは把握していません)


> 30万件程のテーブルのデータをDataAdapterを用いて一度にDataTable化したためのようでした。
(^_^;)


> DataReaderを使う方が適しているのでしょうか?
データ件数が少ない場合は、DataTable の方が適しているケースもあるかもしれませんが、
数十万件という量になると、DataTable での処理には無理があります。

少なくとも、前後の行を参照する必要が一切なく、一行ずつの順次処理で済むのであれば、
ADO.NET の DataReader で参照した方がメモリ効率は良いでしょうね。
(ADODB で言うところの UpdateBatch が行えるわけでもないですし)


> DataReaderは今まであまり使ったことがなかったのですが、
> 速度やメモリ使用の違いなどをアドバイス頂けるとありがたいです。
ザックリ言えば、「現在見ている一行だけ」を参照するのが ADO.NET の DataReader、
「全行をまとめてコピーしてきてから、それを処理する」手法が、ADO.NET の DataTable です。
引用返信 編集キー/
■77258 / inTopicNo.9)  Re[8]: mdb→SQL Server Compactの変換
□投稿者/ クリス (5回)-(2015/10/01(Thu) 13:06:21)
No77249 (魔界の仮面弁士 さん) に返信

いつもありがとうございます。
DataTableの件は、本当に恥ずかしい。ド素人丸出しで申し訳ございません。
まだまだ勉強が足りないようです。

SQL Server Expressについても勉強してみます。

とりあえず、今回のテーマにつきましては、かなりスッキリしました。
改めて御礼申し上げます。

今後ともどうぞよろしくお願い致します。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -