Accessのデーターベースへのレコード挿入 – プログラミング – Home

Accessのデーターベースへのレコー...
 
通知
すべてクリア

[解決済] Accessのデーターベースへのレコード挿入


こまったちゃん
 こまったちゃん
(@こまったちゃん)
ゲスト
結合: 18年前
投稿: 39
Topic starter  

■動作環境      :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のデータベースへの登録方法を教えて下さい。
よろしくお願い致します。


引用未解決
トピックタグ
Multi Posting
 Multi Posting
(@Multi Posting)
ゲスト
結合: 19年前
投稿: 15
 

>_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;
}


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

一応確認ですが、SQL文に間違いはありませんよね?

文字数や変数の型の問題である場合、ADO.Commandオブジェクトから設定するしかないか
も。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>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;
}


返信引用
こまったちゃん
 こまったちゃん
(@こまったちゃん)
ゲスト
結合: 18年前
投稿: 39
Topic starter  

Multi Postingさん, Blueさん
ありがとうございます。

原因は
>Key
でした。

またよろしくお願い致します。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ちょっと一言だけ。

何故、keyだとまずいのかが理解できていないのであれば、
きちんと追求した方が良いと思いますよ。
この何故という発想はとても大事です。
これを調べる事で外にも駄目なパターンがわかるかもしれません。
既に調べておられるのであれば、蛇足ですので忘れてくださって
良いです。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> 何故、keyだとまずいのかが理解できていないのであれば、
Microsoft サポートオンラインにありますね。

Access 2000 での予約語の一覧
http://support.microsoft.com/kb/209187/

>予約単語を含む名での既存のオブジェクトにブラケット([])でのオブジェクト名を囲
むことでエラーが回避できます。
ブラケットって言うんだ。へぇ。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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