データベースへの保存

[戻る]
2006/12/26(火) 14:32:38
CString str;

str.Format("insert into ***(aaa, bbb, ccc, ddd)"
    "values(%d, %d, '%s', '%s')"
    , m_aaa
    , (*it)->m_bbb
    , (*it)->m_ccc
    , (*it)->m_ddd
);

Visual Studio2005MFCで作成しています。
画面に表示されたデータを保存ボタンを押して上記のようにm_aaa〜m_dddをデータベー
スの***に保存しています。m_ccc以外はちゃんと保存されるのですが、m_cccだけ保存ボ
タン押下し終了した後もう一度異なるデータを保存しないと保存されません。つまり一
回遅れて保存されています。はじめの一回で他のデータと同様に保存されるようにした
いです。
お願いします。

Blue 2006/12/26(火) 14:37:13
これだけでわかる人はいないでしょう。

・itとは?
・m_cccとは?(型は何?CString?)
・cccにあたるデータベース上の型は?
・データベースはなに?

2006/12/26(火) 14:52:52
追加です。

・itとは?
iteratorのitです

・m_cccとは?(型は何?CString?)
CString型で宣言しています

・cccにあたるデータベース上の型は?
データベース上ではchar型です

・データベースはなに?
SQLサーバー、Enterprise Manager

m_bbbとm_cccは中身は違いますが、宣言等は同じものです。

たいちう 2006/12/26(火) 14:57:51
str.Formatの直後に、TRACE("%s\n", str.c_str());を追加してみて。
念のため。あとはBlueさんのご指摘どおり。

# 2005は使ったことがないので、別のマクロがあるのかもしれないが。

Blue 2006/12/26(火) 15:03:55
>iteratorのitです
んなことは、名前から予測できましたけど。
そのiteratorの型はなんなのか?ってことを聞きたかったわけで。
おそらく、

std::vector<XXXX>::const_iterator

ってな感じだと思いますが。

>・cccにあたるデータベース上の型は?
>データベース上ではchar型です
ちなみに、おなじ文字列を入れている ddd の型は何でしょうか?


たいちうさんもおっしゃっていますが、実行前にどんなSQL文になっているのか
確認してみてはどうでしょうか?
>TRACE("%s\n", str.c_str());
は違うような。。。

TRACE1("%s\n", str);

として、デバッグ実行してアウトプットウィンドウにどんな文字が出力されているか
確認してください。
(よくわからなければ、AfxMessageBox(str);で確認してもいいです。)

2006/12/26(火) 15:18:58
>>iteratorのitです
>んなことは、名前から予測できましたけど。
>そのiteratorの型はなんなのか?ってことを聞きたかったわけで。
>おそらく、

>std::vector<XXXX>::const_iterator

>ってな感じだと思いますが。

名前の異なる同じような型です。


>>・cccにあたるデータベース上の型は?
>>データベース上ではchar型です
>ちなみに、おなじ文字列を入れている ddd の型は何でしょうか?

dddの型も同じchar型です

>TRACE1("%s\n", str);
>AfxMessageBox(str);

二つで確認した所、
insert into ***(aaa, bbb, ccc, ddd)" "values(1, 1, 12345    , 1234)"
の出力でした。数字は全て期待通りなのですが、問題のcccの値だけ後ろにスペースが入
っていました。これが原因ですか?

Blue 2006/12/26(火) 15:29:38
>insert into ***(aaa, bbb, ccc, ddd)" "values(1, 1, 12345    , 1234)"
これ本当でしょうか?
"の対応が間違っているような。。。
それと ' で囲われなくなっているし。

>str.Format("insert into ***(aaa, bbb, ccc, ddd)"
>    "values(%d, %d, '%s', '%s')"
であれば、

insert into ***(aaa, bbb, ccc, ddd) values(1, 1, '12345', '1234')

となるはずなんですが。


>char型です
char型に文字列入れれるのでしたっけ?

CHAR(5)

とか文字数はないのでしょうか?


ちなみに、どうやってSQL文を実行していますか?
ADO?

2006/12/26(火) 17:02:06
すいません。

insert into ***(aaa, bbb, ccc, ddd) values(1, 1, '12345   ', '1234')
でした。正確に書かなくてはいけないのにすいません。


>CHAR(5)
>とか文字数はないのでしょうか?

cccの方がchar(11) not null,
dddの方がchar(16) not null,です。


>ちなみに、どうやってSQL文を実行していますか?
>ADO?

その辺は不明です。他のものを参考にしながらですので。

Blue 2006/12/26(火) 17:13:49
うーむわからんなぁ。。。
>not null
ならちゃんと更新されるはずなんだけれど。
もしかして、コミットしていなくて、遅れて更新しているように見えるだけとか。
すべて INSERT し終わったらコミットして全てのレコードを確かめていますか?

コミットしていないものを 見て出来ている/出来ていない の確認はどうなんでしょう
か?
まぁ、コミットしちゃうとロールバックできないので一概に同とも言えないと思うけ
ど。

2006/12/26(火) 17:36:51
[[解決]]
直前の情報を確認してみた所、
insert into ***(aaa, bbb, ccc, ddd) values(1, 1, '12345   ', '1234')
ではなく、
insert into ***(aaa, bbb, ccc, ddd) values(1, 1, "", '1234')

とcccに値が入ってない状態でした。cccへの代入をしっかりすればできそうです。
でも二回目の起動で前回の値が入っているということはどうにかなるんじゃないですか
ね。

ITO 2006/12/26(火) 19:21:34
> とcccに値が入ってない状態でした。cccへの代入をしっかりすればできそうです。
型を確実に合わせないと駄目です。

>でも二回目の起動で前回の値が入っているということは
>どうにかなるんじゃないですかね。
「2回目の起動」で確かめるのではなく、ソフトで書き換え後
データ表示ソフト(SQLサーバならあると思うのですが)
で確かめないと駄目です。

m 2006/12/27(水) 14:32:27
×(*it)->m_ccc
○(LPCSTR)(*it)->m_ccc

Blue 2006/12/27(水) 14:54:47
>○(LPCSTR)(*it)->m_ccc
こんな過去ログがありました。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200504/05040059.txt

もしキャストが問題であれば、なんで (*it)->m_ddd の値だけ入るんでしょうかね。

ITO 2006/12/27(水) 19:43:23
SQL文によって代入される変数は、キャスト出来ないと思います。
今回の場合INSERT文ですから、一度データベース変数の型と同じ型の
変数に代入してから(ここでキャストするのはいいと思います。)
SDKの関数だと「SQLBindCol」でセットしないと駄目だと思います。

2006/12/28(木) 15:22:19
[[解決]]
無事解決しました。

おそらく原因はクラスAとクラスBにm_cccがあってしかもポインタとかがゴチャゴチャ
になっていたのからかもしれません。
データベース保存する所できちんと整理して組み立てて、m_dddが保存されない時は
m_cccも空白になるようにしたので解決しました。

ありがとうございました。

古いスレッドには追加発言できません。