データベースの追加が上手く出来ません。ご指導のほど、宜しくお願い致します。
現在の状況は以下の通りです。
<環境>
Windows Me
VC++6.0
<プロジェクトの作成>
MFC appwizerd(exe)よりダイアログベースのプロジェクトを作成→ダイアログリソースを作成
→基本クラスCRecordsetとし新規クラスとしてCMyRecordを作成する。CMyRecordクラスのオブ
ジェクトm_Recordsetを生成し、AddNew関数を利用。
<追加の関数を呼び出している部分(ダイアログの追加ボタンにて呼び出される)>
void CUKOdbcTest2Dlg::OnButtonAdd()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
/* レコードセットが更新可能かどうかを調べる*/
if(!m_Recordset.CanUpdate())
{
AfxMessageBox(データベースにデータを追加できません.);
return;
}
m_Recordset.AddNew();
m_Recordset.m_column3 = m_bunrui;
// m_Recordset.m_column4 = m_day;
m_Recordset.m_column6 = m_kekka;
m_Recordset.m_column2 = m_name;
m_Recordset.m_column1 = m_no;
m_Recordset.m_column5 = m_uriage;
UpdateData(TRUE);
if(!m_Recordset.Update())
{
AfxMessageBox(データベースにデータを追加できません.);
return;
}
UpdateData(FALSE);
}
これで実行し、ダイアログボックスの内容を変更し追加ボタンを押してもデータが追加できませ
ん。どのようにしたらデータベースにデータを追加できるのでしょうか?
どこで失敗しているのかわからないので・・
ひとつだけ・・
UpdateData(TRUE);
は
m_Recordset.AddNew();
の前か後に持っていく方がよいかも・・
最初の
> if(!m_Recordset.CanUpdate())
> {
> AfxMessageBox(データベースにデータを追加できません.);
> return;
> }
これは
m_Recordset.Appendを使うべきではないのですか
その2として既存の同一データの有無の確認はこの処理に入ってくるときには
確認済みと思っていいんですよね!
そんなチェックの処理入っていないように思いますけど?
余計なコード多いかも知れませんけど参考にしてください
--------------------------------------------------------------------------
void CSSMMNMTNView::OnUpdateMenu()
{
CString Sel_Txt;
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
UpdateData(TRUE);
CSSMMNMTNDoc* pDoc = GetDocument();
CSSMMNMTNSet mSet(&pDoc->m_database);
//
if(U_INPT_check() == FALSE){
// タイトル情報設定
mSet.m_strFilter.Format(COP_ID = %d ,m_COP_ID);
この条件値のデータは1件しか存在できないことを仮定しています
if(mSet.Open(CRecordset::dynaset,NULL)) {
if(!mSet.IsEOF()) {
//既存データ 有りの場合
mSet.Edit(); // 変更を可能にする
mSet.m_ITEM_KB = 0;
}
else{
//既存データ なしの場合
mSet.AddNew(); //追加を可能にする
mSet.m_COP_ID = m_COP_ID;
UpdateData(TRUE);
}
if (mSet.CanUpdate()) {mSet.Update(); }
}
mSet.Close();
}
<回答について>
回答ありがとうございました!
回答についてちょっと分からない点がありましたので、質問いたします。
とうぞよろしくお願いします。
それと私はC++とVCを勉強し始めて2週間ほどです。一応
「プログラミング実習VC++ 入門編」
「新C++言語入門(ビギナー編)」
という本を読んだ(読んでいる)程度です。
VCのヘルプを見ながらなんとかここまで組んだという感じです。
初歩的な質問になってしまったら申し訳ないです。
<質問その1>
>m_Recordset.AddNew();
>の前か後に持っていく方がよいかも・・
とありましたので、早速位置を変えて試してみました。
今まではダイアログボックスのエディットボックスを変更して[追加]ボタンを押すと
「PRIMARY KEY違反(中略)'練習テーブル'には重複したキーは挿入できません ステートメン
トを終了しました」
と表示されてしまい、再び[追加]ボタンを押すとレコードが追加されているといった具合でし
た。
それで位置を変えてみた結果、[追加]ボタンを1回押した時にレコードが追加されるようになり
ました。
これはどうしてでしょうか。
アドバイスに対する私なりの解釈は以下の通りです。
①m_Recordset.AddNew()で新しいレコードが追加
②UpdateData(TRUE)でダイアログボックスから変数を取得(よく分かりません…)
③m_Recordset.データベースのフィールド名 = ダイアログボックスの各変数 によりデータセ
ット
④m_Recordset.Update()で追加確定(?)
⑤UpdateData(FALSE)でダイアログボックスに値を表示
合ってますでしょうか?
長くなりそうでしたので分けました。
<質問その2>です。よろしくお願いします。
woodさんへ
>最初の
>> if(!m_Recordset.CanUpdate())
>> {
>> AfxMessageBox(データベースにデータを追加できません.);
>> return;
>> }
>これは
>m_Recordset.Appendを使うべきではないのですか
ありがとうございます。m_RecordsetCanAppend()にしました。
これはレコードセットに新規レコードが追加可能か調べる関数ということでしょうか。
>その2として既存の同一データの有無の確認はこの処理に入ってくるときには
>確認済みと思っていいんですよね!
いいえ。既存の同一データの有無の確認までは考えていませんでした…。
>そんなチェックの処理入っていないように思いますけど?
>余計なコード多いかも知れませんけど参考にしてください
ありがとうございます。調べてみます。
>void CSSMMNMTNView::OnUpdateMenu()
とありますが、最初に記述した手順で作成された私のプロジェクトにはviewクラスがありませ
ん。ダイアログのクラスで追加をしていますが、SDIで作成したほうが良かったのでしょうか。
今あるクラスは
CAboutDlg,CmyRecordset,CUKOdbcTest2App,CUKOdbcTest2Dlg
の4つのみです。
> if(mSet.Open(CRecordset::dynaset,NULL)) {
> if(!mSet.IsEOF()) {
>//既存データ 有りの場合
> mSet.Edit(); // 変更を可能にする
> mSet.m_ITEM_KB = 0;
> }
> else{
>//既存データ なしの場合
> mSet.AddNew(); //追加を可能にする
>
> mSet.m_COP_ID = m_COP_ID;
> UpdateData(TRUE);
> }
CRecordsetオブジェクトをOPENした時に、既存データの有無をチェックするのですね!
そこでmSet.m_ITEM_KB = 0;とありますが、これはどういった意味になるのでしょう
か?
現在vcのヘルプを中心に調べていますが、
何か参考になるページや書籍がありましたらおしえていただけますか?
>②UpdateData(TRUE)でダイアログボックスから変数を取得(よく分かりません…)
これわからないと言うのは困りましたね!
少なくとも既存データチェックを行うためには、入力情報必要ではないですか?
VIEWでもDLGでもかまいません
多少変なコードになってしまいましたごめんなさい
ADDNEW()
は、追加可能な空のバッファをただ用意してくれるだけです
だからメンバー変数(自分のレコードセットメンバー)を編集
すればよい
>そこでmSet.m_ITEM_KB = 0;とありますが、これはどういった意味になるのでしょう
>か?
これはメンバー変数(自分のレコードセットメンバー)です
EDIT()
呼び出してあるレコードを編集可能にする
(勝手な解釈としては:レコードポインタのロックをしてくれる)
このあと編集すればよい
最後に
> if (mSet.CanUpdate()) {mSet.Update(); }
この部分でDBにデータを反映してくれます
このプログラムはSQL SERVER 7.0をODBC接続を想定しています
DBによっては多少組み方違う見たいですけど
「VC++ 6.0 データベースプログラミング 3週間」
こんな感じのタイトルの本あったよ COM や OLEDBの勉強にもなりますよ
回答ありがとうございました!
ダイアログボックスからデータベースにレコードが追加できるようになりました!
また何かありまし時はよろしくお願いします。