.netで作られた社内プログラム(.exe)があります。

プログラムはmdbにSQLを投げてデータを表示させるものです。

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

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

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/02/07 10:33:23

ベストアンサー

id:tea_cup No.1

回答回数1071ベストアンサー獲得回数194

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比較

他1件のコメントを見る
id: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/

2014/02/07 03:20:31
id:qz2248

ありがとうございます。

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

2014/02/07 10:27:41

その他の回答2件)

id:tea_cup No.1

回答回数1071ベストアンサー獲得回数194ここでベストアンサー

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比較

他1件のコメントを見る
id: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/

2014/02/07 03:20:31
id:qz2248

ありがとうございます。

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

2014/02/07 10:27:41
id:degucho No.2

回答回数281ベストアンサー獲得回数75

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

id:qz2248

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

2014/02/07 10:37:50
id:cx20 No.3

回答回数607ベストアンサー獲得回数108

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/

id:qz2248

ありがとうございます。

私にはハードルがやや高かったので他の方法で解決できました。

2014/02/07 10:38:47

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません