■動作環境 :WindowsXP
■開発環境 :Visual C++6.0(ダイアログベース)
■データベース :Access2000(ADO接続)
いつもお世話になります。
Access 2000で作成した 来客予定マスタ テーブルに以下の方法で
レコード挿入をしようとしています。
// レコード挿入プログラム
_bstr_t bstrQuery(Sql);
m_pConnect->Execute( bstrQuery, NULL, adCmdText);
CString Sql に以下をセット
{INSERT INTO 来客予定マスタ (Key, 予定日, 予定時刻, 会社名, 氏名, 人数,
担当者部署, 担当者, 内線番号)values (100,'2006/01/01','01:00',
'あいうえおかきくけこさしすせそ','あいうえお かきくけこ','01','あいう',
'あいうえお かきくけこ','10')}
_bstr_t bstrQuery(Sql);で型変換すると
bstrQuery の中身は
{INSERT INTO 来客予定マスタ (Key, 予定日, 予定時刻, 会社名, 氏名, 人数,
担当者部署, 担当者, 内線番号)values (100,'2006/01/01','01:00',
'あいうえおかきくけこさしすせそ','あいうえお か (1)}
容量オーバーでここまでしかセットできなく下記のメッセージがでます。
ハンドルされていない例外は appointment.exe(KERNEL32.DLL)にあります:
0xE06D7363:Microsoft C++ Eception
例えば
Sql = INSERT INTO 来客予定マスタ (Key, 予定日, 予定時刻)
values(1, '2006/12/12', '17:15');
_bstr_t bstrQuery(Sql);
m_pConnect->Execute( bstrQuery, NULL, adCmdText);
だとAccessに書き込まれるので、型変換の容量オーバーが原因だと考え
下記のやり方を試したのですが
INSERT INTO 来客予定マスタ VALUES(100,'2006/12/31','24:55',
'あいうえおかきくけこさしすせそ','あいうえお かきくけこ','15',
'あいうえお','あいうえお かきくけこ','30')
上記と同じ例外メッセージがでます。
Accessのデータベースへの登録方法を教えて下さい。
よろしくお願い致します。
>_bstr_t bstrQuery(Sql);で型変換すると
>bstrQuery の中身は
>{INSERT INTO 来客予定マスタ (Key, 予定日, 予定時刻, 会社名, 氏名, 人数,
> 担当者部署, 担当者, 内線番号)values (100,'2006/01/01','01:00',
>'あいうえおかきくけこさしすせそ','あいうえお か (1)}
>容量オーバーでここまでしかセットできなく下記のメッセージがでます。
ちゃんとbstrQueryには文字が入っていますよ。
ローカルウィンドウやウォッチでは表示に限界があるだけで、セットできていないよう
に見えるだけでしょう。
一応試したコード
#include <windows.h>
#include <comdef.h>
int main()
{
const char* p =
INSERT INTO 来客予定マスタ (Key, 予定日, 予定時刻, 会社名, 氏名, 人数,
担当者部署, 担当者, 内線番号)values (100,'2006/01/01','01:00',
'あいうえおかきくけこさしすせそ','あいうえお かきくけこ','01','あいう',
'あいうえお かきくけこ','10');
_bstr_t b( p );
MessageBoxW( NULL, b, NULL , MB_OK );
return 0;
}
一応確認ですが、SQL文に間違いはありませんよね?
文字数や変数の型の問題である場合、ADO.Commandオブジェクトから設定するしかないか
も。
>Key
というフィールド名がまずい気がしてきた。
ためしに、キー にするとちゃんとINSERTできるっぽい。
[]をつけて回避も出来るようです。
参考: http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=21925&forum=7
一応試したコード
#include <windows.h>
#include <comdef.h>
#include <iostream>
#import C:\Program Files\Common Files\System\ADO\msado15.dll rename
( EOF, adoEOF )
HRESULT Test()
{
HRESULT hr = S_OK;
ADODB::_ConnectionPtr pConn = NULL;
try
{
hr = pConn.CreateInstance( __uuidof( ADODB::Connection ) );
if ( FAILED( hr ) ) _com_issue_error( hr );
pConn->Mode = ADODB::adModeReadWrite;
pConn->Open( LProvider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb,
L", L", ADODB::adConnectUnspecified );
pConn->BeginTrans();
_bstr_t sql(
LINSERT INTO 来客予定マスタ
L( [Key], 予定日, 予定時刻, 会社名, 氏名,
L人数 , 担当者部署, 担当者, 内線番号 )
LVALUES ( '10', '2006/01/01', '01:00' ,
L'あいうえおかきくけこさしすせそ',
L'あいうえお かきくけこ', '01', 'あいう',
L'あいうえお かきくけこ', '10' )
);
pConn->Execute( sql, NULL, ADODB::adCmdText );
pConn->CommitTrans();
pConn->Close();
}
catch ( _com_error& e )
{
hr = e.Error();
printf( %s\n, e.ErrorMessage() );
}
if ( pConn ) pConn.Release();
return hr;
}
int main()
{
if ( SUCCEEDED( ::CoInitialize( NULL ) ) )
{
Test();
::CoUninitialize();
}
return 0;
}
Multi Postingさん, Blueさん
ありがとうございます。
原因は
>Key
でした。
またよろしくお願い致します。
ちょっと一言だけ。
何故、keyだとまずいのかが理解できていないのであれば、
きちんと追求した方が良いと思いますよ。
この何故という発想はとても大事です。
これを調べる事で外にも駄目なパターンがわかるかもしれません。
既に調べておられるのであれば、蛇足ですので忘れてくださって
良いです。
> 何故、keyだとまずいのかが理解できていないのであれば、
Microsoft サポートオンラインにありますね。
Access 2000 での予約語の一覧
http://support.microsoft.com/kb/209187/
>予約単語を含む名での既存のオブジェクトにブラケット([])でのオブジェクト名を囲
むことでエラーが回避できます。
ブラケットって言うんだ。へぇ。