データベースのレコード追加について教えてください – プログラミング – Home

データベースのレコード追加について教え...
 
通知
すべてクリア

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


のりのり
 のりのり
(@のりのり)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

データベースの追加が上手く出来ません。ご指導のほど、宜しくお願い致します。

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

<環境>
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
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 80
 

どこで失敗しているのかわからないので・・

ひとつだけ・・
UpdateData(TRUE); 

m_Recordset.AddNew();
の前か後に持っていく方がよいかも・・


返信引用
wood
 wood
(@wood)
ゲスト
結合: 24年前
投稿: 895
 

最初の
> 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();
}


返信引用
のりのり
 のりのり
(@のりのり)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

<回答について>
回答ありがとうございました!
回答についてちょっと分からない点がありましたので、質問いたします。
とうぞよろしくお願いします。

それと私は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)でダイアログボックスに値を表示
合ってますでしょうか?


返信引用
のりのり
 のりのり
(@のりのり)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

長くなりそうでしたので分けました。
<質問その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
 wood
(@wood)
ゲスト
結合: 24年前
投稿: 895
 

>②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の勉強にもなりますよ


返信引用
のりのり
 のりのり
(@のりのり)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

回答ありがとうございました!
ダイアログボックスからデータベースにレコードが追加できるようになりました!

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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