成績データベースの更新



DialogBox に表示した成績データベースのレコードを更新します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. あらかじめ成績データベースを作成して MySQL を起動して下さい。
    詳細は データベースにコネクト を参照して下さい。
  2. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    追加/削除のボタンとメッセージ(Text Box)は不要です。
    Spin ボタンの値を自動的に EditBox に表示する方法です。
    DialogBox のキャプションとIDです。
    BOXキャプションID
    DialogBox 成績データベース IDD_DIALOG1
    EditBox 学籍番号 IDC_EDIT1
    EditBox 名前 IDC_EDIT2
    EditBox 数学 IDC_EDIT3
    EditBox 英語 IDC_EDIT4
    EditBox C言語 IDC_EDIT5
    SpinButton IDC_SPIN1
    EditBox IDC_EDIT6
    Button 更新 IDC_UPD
    Button 終了 IDCANCEL
  3. MySQL のプログラムは、mysql.h をインクルードして libmysql.lib をリンクします。
    szDB はデータベースの名前で、szSQL は発行するクエリです。
    myData が MYSQL のオブジェクトのポインタです。
    res は SQL 文の実行結果のオブジェクトを格納する領域です。
    Count は抽出されたレコード件数です。
    row はレコードのアイテムを取得する領域です。
    g_hSpin は Spin Button の Handle です。
    g_Pos は現在 DialogBox に表示中のレコード番号です。
        /***********************************************/
        /*★ MySQL の成績データを更新する    前田 稔 ★*/
        /***********************************************/
        #include    <windows.h>
        #include    <commctrl.h>
        #include    <mysql.h>
        #include    "resource.h"
        #pragma     comment(lib,"libmysql.lib")
    
        // 使用するデータベース
        #define     szDB    "mark"
        // 発行するクエリー
        #define     szSQL   "SELECT * FROM mark_table WHERE v1<50 OR v2<50 OR v3<50"
    
        // MYSQLの定義
        MYSQL       *myData= NULL;      // MySQL の Object
        MYSQL_RES   *res= NULL;         // クエリーの Object
        UINT        Count;              // Record 件数
        MYSQL_ROW   row;                // ITEM の領域
    
        // DialogBox の制御領域
        HWND        g_hSpin;            // Spin Handle
        UINT        g_Pos;              // 現在表示中のレコード
        
  4. WinMain() では MySQL を初期化してサーバーに接続します。
    詳細は DialogBox で表示 を参照して下さい。
  5. CALLBACK 関数の WM_COMMAND です。
    更新ボタンをクリックすると IDC_UPD がポストされてきます。
    Update() 関数でデータベースを更新します。
        //★ CALLBACK 関数
        LRESULT CALLBACK DialogProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
        {          :
                   :
            case WM_COMMAND:
                switch(LOWORD(wParam))
                {   case IDC_UPD:
                        Update(hDlg);
                        break;
                    case IDCANCEL:
                        PostMessage(hDlg,WM_CLOSE,0,0);
                        return TRUE;
                }
                break;
        
  6. データベースを更新する Update() 関数です。
    EditBox から三科目のデータを取得して SQL 文を作成します。
    "UPDATE mark_table ..." がデータベースを更新する SQL 文です。
    クエリの発行前に MessageBox で更新確認を行います。
    更新が完了すると一度 res を解放して、レコードを選択し直します。
        // Data Base を更新
        LRESULT  Update(HWND hDlg)
        {   char    buf1[8],buf2[8],buf3[8];
            char    sql[128];
            int     id;
    
            GetDlgItemText(hDlg,IDC_EDIT3,buf1,sizeof(buf1));
            GetDlgItemText(hDlg,IDC_EDIT4,buf2,sizeof(buf2));
            GetDlgItemText(hDlg,IDC_EDIT5,buf3,sizeof(buf3));
            wsprintf(sql,"UPDATE mark_table SET v1=%s, v2=%s, v3=%s WHERE no=%s",
                     buf1,buf2,buf3,row[0]);
            id= MessageBox(NULL,sql,"データの更新確認",MB_YESNO | MB_ICONQUESTION);
            if (id != IDYES)	return FALSE;
    
            // データ更新のクエリを発行
            if (mysql_query(myData,sql))
            {   MessageBox(NULL,sql,"MySQL Error",MB_OK);
                return FALSE;
            }
            if (res)
            {   mysql_free_result(res);
                res= NULL;
            }
            if (mysql_query(myData,szSQL))
            {   MessageBox(NULL,"Query Execute Error","MySQL Error",MB_OK);
                return FALSE;
            }
            res= mysql_store_result(myData);
            Count= (int)mysql_num_rows(res);
            if (g_Pos>=Count)   g_Pos= Count-1;
            View(hDlg,g_Pos);
            return TRUE;
        }
        

超初心者のプログラム入門(Win32API C++)