人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

.netで作られた社内プログラム(.exe)があります。
プログラムはmdbにSQLを投げてデータを表示させるものです。

プログラムからmdbに投げるSQLを取得する方法やツールはありませんでしょうか。

プログラムを製造した担当者が退社してしまった為、新しく作り直しているのですが、SQLの違いを確認したい部分があるのですが、その方法が分かりません。

環境はWin7(64bit)です。
宜しくお願い致します。

●質問者: qz2248
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● tea_cup
ベストアンサー

SQLの実行計画(プラン)は以下の様にして表示できます。

MS によるサポートはありませんが、レジストリを修正する事により、解析結果が Showplan.out と言う名前のテキストファイルに出力されます。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Debug

の下に JETSHOWPLAN と言う文字列を作り、値を ON にしておくと、クエリを実行する度に、 Showplan.out にアペンドされます。

※4.0の部分はJetの最新バージョンが何かによって変わります。
※SHOWPLAN.OUTの出力先は、MDB と同じディレクトリだったり、マイドキュメントだったり環境依存。
※ずっと ON のままにしておくと、Showplan.out がどんどん膨れていくので、こまめに OFF しましょう。

Works - 逆引きSQL比較


qz2248さんのコメント
ご回答頂き、ありがとうございます。 当方の環境がwin7(64bit),Access2007でしたので、下記レジストリにJETSHOWPLANという文字列を作り、ONで設定することによってSHOWPLAN.OUTがドキュメントフォルダに作成されました。 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Debug しかしながら、Accessで直接クエリを実行した場合はログが出るのですが、プログラムからMDBに接続した際のログは残りませんでした。 何かお気づきの点がありますでしょうか。 お手数をお掛けして申し訳ございません。

cx20さんのコメント
横やりで失礼します。 どちらのデータベースエンジンを使用するかは、接続文字列によります。 Provider=Microsoft.Jet.OLEDB.4.0 … 主に *.mdb 用 Provider=Microsoft.ACE.OLEDB.12.0 … 主に *.accdb 用 恐らく、今回の .NET のプログラムのケースでは、上記の「Jet.OLEDB.4.0」が接続文字列に使用されているのではないかと思われます。 であれば、 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Debug の、設定にて、トレースできるかと思います。 <参考情報> ■ CX's Hello, World! ? Hello, Jet Database World! http://cx20.main.jp/blog/hello/2012/03/09/hello-jet-database-world/ ■ CX's Hello, World! ? Hello, ACE Database World! http://cx20.main.jp/blog/hello/2012/03/10/hello-ace-database-world/

qz2248さんのコメント
ありがとうございます。 ご指摘の通り設定したとろこ、デスクトップにshowplan.outが出力されました。 解読が難しいですが、頑張ってみます。

2 ● degucho

http://www.atmarkit.co.jp/fdotnet/dotnettips/1055ilspy/ilspy.html
.NetであればILSpyで逆アセンブルすれば中に埋め込まれてる
SQLが見られると思います。


qz2248さんのコメント
ありがとうございます。 ご教授頂いたソフトはややとっつきにくかったので、「.NET Reflector」でソースを確認できました。

3 ● cx20

ODBC 接続をすることで、ODBC トレースの機能が使えそうです。

Access MDB の実テーブルを SQL Server を移行し、Access MDB からはリンクテーブルで接続することで、ODBC 接続が実現可能そうです。試してなくて恐縮ですが。。。
(そもそも、SQL Server であれば、SQL Profiler 等が使えるので、ODBC トレースを使う必要もないかと思いますが。。。)

■ Link Table 経由で SQL Server にアクセスする案

[C#]
 ↓
[ADO.NET]
 ↓
[System.Data.OleDb]
 ↓
[Microsoft.Jet.OLEDB.4.0]
 ↓
[LinkTable MDB]
 ↓
[ODBC]
 ↓ ← ODBC トレース
[SQL Server]

SQL Server を使わないケースを検討してみましたが、以下の2ケースでは、エラーが出て実現できませんでした。

■ Link Table 経由で Access MDB にアクセスする案

[C#]
 ↓
[ADO.NET]
 ↓
[System.Data.OleDb]
 ↓
[Microsoft.Jet.OLEDB.4.0]
 ↓
[LinkTable MDB]
 ↓
[ODBC]
 ↓ ← ODBC トレース
[Access MDB]

<結果:NG>
[エラーメッセージ]
Access MDB から ODBC 経由で別の MDB へのリンクテーブルは貼れない。
ODBC を使用して、外部の Microsoft Access データベース エンジンのテーブルや
組み込み可能な ISAM データベースのテーブルのインポート、エクスポート、またはリンクを行うことはできません。
■ Microsoft OLE DB Provider for ODBC 経由で Access MDB にアクセスする案 

[C#]
 ↓
[ADO.NET]
 ↓
[System.Data.OleDb]
 ↓
[MSDASQL](Microsoft OLE DB Provider for ODBC)
 ↓
[ODBC]
 ↓ ← ODBC トレース
[Access MDB]

<結果:NG>
[エラーメッセージ]
OLEDB の .Net Framework データ プロバイダ (System.Data.OleDb) は、
ODBC ドライバ (MSDASQL) の Microsoft OLE DB プロバイダをサポートしません。
ODBC (System.Data.Odbc) の .Net Framework データ プロバイダを使用してください。

<参考情報>
■ CX's Hello, World! » Hello, ADO.NET World!
http://cx20.main.jp/blog/hello/2012/03/24/hello-ado-net-world/


qz2248さんのコメント
ありがとうございます。 私にはハードルがやや高かったので他の方法で解決できました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ