[開発環境]
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からの例外ということですよね・・・。
お心あたりの方がいらっしゃいましたら、ご教授お願い致します。
すみません、ソースコードが崩れてしまいました・・・。
読みにくくなってしまい申し訳ありません。
自己解決となりました。
調査して分かったのですが、
まず、
// レコードセット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
お騒がせして申し訳ありませんでした。