ODBC接続レコードセットOPENでの例外について – プログラミング – Home

ODBC接続レコードセットOPENでの...
 
通知
すべてクリア

[解決済] ODBC接続レコードセットOPENでの例外について


しお
 しお
(@しお)
ゲスト
結合: 14年前
投稿: 3
Topic starter  

[開発環境]
VC++ 6.0(MFC)
WindowsXP(SP3)
Access97 / ODBC接続

Access97のMDBファイルをODBC接続にてOPENし、
テーブル「MyTable」に対してレコードセットをOPENすると以下の例外が発生してしまい
ます。

キャストの指定に無効な文字値が使用されました 列番号 4 (Field5)
State:22005,Native:39,Origin:[Microsoft][ODBC Microsoft Access Driver]

まず、対象のテーブルは以下の構成となっています。
いずれもキーおよびインデックスは無しです。

---------------------------------------------------------
テーブル名:MyTable
フィールド名 データ型
Field1 オートナンバー
Field2 テキスト
Field3 日付時刻
Field4 整数
Field5 テキスト ←ここでキャストエラー?
Field6 テキスト
Field7 テキスト
Field8 テキスト
---------------------------------------------------------

例外が発生する付近のコードは以下です。

CString sqlGroup = SELECT Field2, Field3, Field4, Field5, Field6,
Field7, Field8 FROM MyTable ;
sqlGroup += GROUP BY Field2, Field3, Field4, Field5, Field6, Field7,
Field8;

CString sqlCount = SELECT Count(*) As RecNo FROM MyTable;

CDatabase *oReadDatabase = new CDatabase;

int recCount = 0;

//接続文字列生成
CString strCon = _T(Driver={Microsoft Access Driver (*.mdb)};DBQ=);

//接続
try
{
oReadDatabase->OpenEx( _T( strCon + _T(FileName) ),
CDatabase::noOdbcDialog );
}
catch (CException *e) {
TCHAR szCause[255];
e->GetErrorMessage( _T(szCause), 255, 0);
e->Delete();
return FALSE;
}

// レコードセットOPEN
CRecordset *rsRead = new CRecordset(oReadDatabase);

// 総件数を取得
rsRead->Open(dbOpenDynaset, _T(sqlCount), dbReadOnly);
if ( !rsRead->IsEOF() )
{
rsRead->GetFieldValue(_T(RecNo), _T(str));
recCount = atoi(str.GetBuffer(8));
}
rsRead->Close();

rsRead->Open(dbOpenDynaset, _T(sqlGroup), dbReadOnly); ←ここで例外
が発生

上記の例外メッセージをネット検索してみたところ、
HITはしたのですが、全て英語または中国語のサイトでした・・・。

なぜこのような例外が出たのか、原因が分かりません。
Accessを開き、sqlGroupのクエリーを実行したところ、問題なくデータ抽出できていま
す。
ODBCからの例外ということですよね・・・。

お心あたりの方がいらっしゃいましたら、ご教授お願い致します。


引用未解決
トピックタグ
しお
 しお
(@しお)
ゲスト
結合: 14年前
投稿: 3
Topic starter  

すみません、ソースコードが崩れてしまいました・・・。
読みにくくなってしまい申し訳ありません。


返信引用
しお
 しお
(@しお)
ゲスト
結合: 14年前
投稿: 3
Topic starter  

自己解決となりました。

調査して分かったのですが、

まず、
// レコードセットOPEN
CRecordset *rsRead = new CRecordset(oReadDatabase);

の部分は、実際(例外発生のコード)は、CRecordクラスの派生クラスです。
※先の投稿のコピペミスです。すみません。。。

(正)
CMyRecordset *rsRead = new CMyRecordset(oReadDatabase);

派生クラスのフィールドですが、

テーブル「MyTable」の構成
---------------------------------------------------------
テーブル名:MyTable
フィールド名 データ型
Field1 オートナンバー
Field2 テキスト
Field3 日付時刻
Field4 整数
Field5 テキスト ←ここでキャストエラー?
Field6 テキスト
Field7 テキスト
Field8 テキスト
---------------------------------------------------------

派生クラスCMyRecordsetのヘッダー

// Field/Param Data
//{{AFX_FIELD(CDWRecordset, CRecordset)
int m_fField1;
CString m_fField2;
CTime m_fField3;
int m_fField4;
CString m_fField5;
CString m_fField6;
CString m_fField7;
CString m_fField8;
//}}AFX_FIELD

上記の状態で
CString sqlGroup = SELECT Field2, Field3, Field4, Field5, Field6, Field7,
Field8 FROM MyTable ;
sqlGroup += GROUP BY Field2, Field3, Field4, Field5, Field6, Field7, Field8;

rsRead->Open(dbOpenDynaset, _T(sqlGroup), dbReadOnly);

を実行したために、今回の例外が発生したようです。
詳しい原因についてはよくわかっていません。。。

対策としては、
派生クラスではなく、そのままCRecordsetクラスを使用し、
クエリ文のsqlGroupを以下のように修正したところ、期待通りの動作になりました。

SELECT DISTINCT Field2, Field3, Field4, Field5, Field6, Field7, Field8 FROM
MyTable

お騒がせして申し訳ありませんでした。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました