いつも参考にさせてもらっています。
SQL Serverへの接続に関して質問させてもらいます。
環境
・Win Xp Pro
・VC++ 2005 MFC SDI
・SQL Server 2005 Express Edition
AppのInitInstanceに、
#include <afxdb.h>
~~~~~~~~~~
CString strCon;
CString strSql;
//接続文字列生成
strCon = DSN=SQLServerTest;;
//実行SQL生成
strSql = select * from test_table;
CDatabase Db;
//接続
Db.OpenEx(strCon, CDatabase::openReadOnly | CDatabase::noOdbcDialog); ←ココ
//実行
CRecordset Rs(&Db);
Rs.Open(CRecordset::forwardOnly, strSql);
と記述して実行したところ、「ココ」で指し示している箇所でエラーになりました。
エラーのメッセージは、
初回の例外が発生しました: Microsoft C++ の例外: CDBException (メモリの場所
0x0012faa0)。
初回の例外が発生しました: Microsoft C++ の例外: [rethrow] (メモリの場所
0x00000000)。
ハンドルされていない例外が発生しました: Microsoft C++ の例外: CDBException (メモ
リの場所 0x0012faa0)。
と出力されました。
ネットで色々調べたのですが、何が悪いのか全くわかりませんでした。
対処法をご存知の方、アドバイスをお願いします。
追記:
ODBCデータソースアドミニストレーターでSQL ServerのユーザーDSNは追加済みで、接続
テストは正常終了しています。
DBのある環境では無いので試せませんし、VC6しか入ってないのですが、
CDBExceptionの内部にある、メッセージは何て書いてありますか?
m_strErrorとかに書いてあるかも
もしくは、CExceptionのGetErrorMessageとかでもいいかも
説明が書いてあれば、原因が分かるかもしれないです
例として、
SQL Serverが見つかりません
とか
ユーザーまたはパスワードが間違っています。
とか
入っているかもしれないです。
外していたらすみません。
最近DB関連から遠ざかってるもので・・・
switch さん
レスありがとうございます。
少し間違いがありましたので、訂正します。
エラーの箇所ですが、
Db.OpenEx(...);
ではなく、
Rs.Open(CRecordset::forwardOnly, strSql);
でエラーになっていました。
出力のウィンドウを見ると、SQL ServerにはODBCで接続できているようです。
すいませんでした。
それで、エラー時のm_strErrorの内容ですが、
オブジェクト名'test_table'が無効です。
ステートメントを準備できませんでした。
となっています。
これは、test_tableにアクセスできていないということでしょうか?
SQL Serverの設定がまだ必要なのか、もう少し調べてみます。
テーブルが無いって言ってますね
おそらくSQLサーバーには繋がっていますが、
どのデータベースかわからないようです
接続文字列にdatabase=xxxxxxとして
明示的に指定してみてはどうでしょう
odbcでデータベース名を設定しても、
見てくれるかどうか怪しいので…
環境が無いので憶測ですが
switch さん
ありがとうございます。
SQL ServerでSELECT文等を自動生成する機能があるので、生成してみたところ、
SELECT [test_no]
,[test_name]
FROM [TestDB].[dbo].[test_table]
というものができました。
それで、VS側で
strSql = select * from test_table;
ではなく、
strSql = select * from [TestDB].[dbo].[test_table];
と記述して実行したところ、上手くいきました。
ありがとうございました。