データベースのレコード追加について教えてください

[戻る]
のりのり [E-Mail] 2002/06/26(水) 19:27:00
データベースの追加が上手く出来ません。ご指導のほど、宜しくお願い致します。

現在の状況は以下の通りです。

<環境>
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);
}

これで実行し、ダイアログボックスの内容を変更し追加ボタンを押してもデータが追加できませ
ん。どのようにしたらデータベースにデータを追加できるのでしょうか?

不良PG [E-Mail] 2002/06/26(水) 19:44:20
どこで失敗しているのかわからないので・・

ひとつだけ・・
UpdateData(TRUE); 
は
m_Recordset.AddNew();
の前か後に持っていく方がよいかも・・

wood 2002/06/26(水) 22:20:19
最初の
>    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();
}

のりのり [E-Mail] 2002/06/27(木) 11:12:44
<回答について>
回答ありがとうございました!
回答についてちょっと分からない点がありましたので、質問いたします。
とうぞよろしくお願いします。

それと私はC++とVCを勉強し始めて2週間ほどです。一応
「プログラミング実習VC++ 入門編」
「新C++言語入門(ビギナー編)」
という本を読んだ(読んでいる)程度です。
VCのヘルプを見ながらなんとかここまで組んだという感じです。

初歩的な質問になってしまったら申し訳ないです。

<質問その1>
>m_Recordset.AddNew();
>の前か後に持っていく方がよいかも・・

とありましたので、早速位置を変えて試してみました。

今まではダイアログボックスのエディットボックスを変更して[追加]ボタンを押すと
「PRIMARY KEY違反(中略)'練習テーブル'には重複したキーは挿入できません ステートメン
トを終了しました」
と表示されてしまい、再び[追加]ボタンを押すとレコードが追加されているといった具合でし
た。
それで位置を変えてみた結果、[追加]ボタンを1回押した時にレコードが追加されるようになり
ました。
これはどうしてでしょうか。
アドバイスに対する私なりの解釈は以下の通りです。
@m_Recordset.AddNew()で新しいレコードが追加
AUpdateData(TRUE)でダイアログボックスから変数を取得(よく分かりません…)
Bm_Recordset.データベースのフィールド名 = ダイアログボックスの各変数 によりデータセ
ット
Cm_Recordset.Update()で追加確定(?)
DUpdateData(FALSE)でダイアログボックスに値を表示
合ってますでしょうか?

のりのり [E-Mail] 2002/06/27(木) 11:26:50
長くなりそうでしたので分けました。
<質問その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のヘルプを中心に調べていますが、
何か参考になるページや書籍がありましたらおしえていただけますか?

wood 2002/06/27(木) 12:37:11
>AUpdateData(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の勉強にもなりますよ

のりのり [E-Mail] 2002/06/27(木) 18:25:22
[[解決]]
回答ありがとうございました!
ダイアログボックスからデータベースにレコードが追加できるようになりました!

また何かありまし時はよろしくお願いします。

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