ODBC使用CRecordsetのAddNew()

[戻る]
omiomi 2004/12/17(金) 20:54:57
VC++.net MFCを使用してAccessのmdbファイルへの書き込みをしたいと思っています。
以下の質問です。

・CRecordsetのAddNew()を使って行を追加する以下のサンプルがあります。

--------------------------------------------------------
CRecSet    rs;        //作成したレコードセットクラス

CString    s_name;
CString s_tel;

rs.Open();
if(!rs.CanAppend()){
    AfxMessageBox("追加できません");
    return;
}
rs.AddNew();

((CEdit*)GetDlgItem(IDC_NAME))->GetWindowText(s_name);
((CEdit*)GetDlgItem(IDC_TEL))->GetWindowText(s_tel);

rs.m_name=s_name;
rs.m_tel=s_tel;

if(!rs.Update())
    AfxMessageBox("更新できません");
rs.Requery();
rs.Close();

---------------------------------------------------------

問題は
rs.m_name=s_name;
rs.m_tel=s_tel;
の部分です。

m_nameとm_telはDBの列を示しているメンバ変数だと思うのですが、
どのようにすれば設定できるのでしょうか?

CDatabaseクラスで直接ExecuteSQLを使う方法ですと
アクセス時間がかかるようですので、
できればAddNew()を使いたいです。

・Recordsetのサブクラスを作るべきか
⇒mdbはひとつで、複数のテーブルを取り扱いたいと思っています。
Recordsetのサブクラスを作ることで何かメリットがあるのでしょうか?
テーブルの数だけサブクラスを作ることになって
面倒になる気がするのですが。

初歩的な質問と思いますが、よろしくお願いします。

wood 2004/12/18(土) 13:46:53
MFC 使っていると DDX、DDVの恩恵のあづかっているように
RecordsetはRFXの恩恵にあづかれると思いますよ

なお「CRecSet」の中で定義していると思われる「m_name」と「m_tel」の
データ型がはっきりしてませんが「CString」で定義されるものなのでしょうか
代入すべき文字数などの制限は必要ないのでしょうか

例)
sprintf(m_name,"%s",s_name)
こんなので「CString」を「char」にする必要あるんじゃないの?

RFXは定義しておくとDB型変換してくれるよ
必ずDBのデータ型とC/C++のデータ型が一致しているとは限らないので
Recordsetは定義したほうが良いと思います

omiomi 2004/12/18(土) 20:38:29
woodさん。
返信ありがとうございます。

ただ残念ながら私の求めている答えとは違います。

<1つめの質問に関して>
サンプルはあれ以上の情報はありません。
私が知りたいのは、「m_name」と「m_tel」の型ではなく、
どうすれば実際のテーブルの列と「m_name」や「m_tel」を
結び付けているかということです。
「m_name」と「m_tel」がテーブルの列名っていうことはないですよね?
classWizardを利用するという記述も見かけましたが、
そのやり方がわかりません。

<2つめの質問に関して>
CRecordsetを使いたくないのではないです。
私が調べたところでは、
CRecordsetのサブクラスを作るとデータベースへの接続を
自動でしてくれるので便利といったような記述をみかけましたが、
テーブルの数だけサブクラスを作ることになって面倒ではないか、
それならサブクラスを作らずにCRecordset型変数を使えば
いいのじゃないかということです。

よろしくお願いします。

omiomi 2004/12/18(土) 20:41:53
http://www.microsoft.com/japan/developer/library/vccore/_core_classwizard.3a_.bi
nding_recordset_fields_to_table_columns.htm#_core_adding_columns_to_your_records
et

すいません。↑1番目の質問の答えはこれですね。
CRecordsetのサブクラスは作る必要があるようですね。

途中の意味不明な書き込みなんとかなりませんかね。

omiomi 2004/12/18(土) 22:08:46
http://www.microsoft.com/japan/developer/library/vccore/_core_classwizard.3a_.cr
eating_a_recordset_class.htm#_core_selecting_a_data_source_in_classwizard

すみません。こっちでした。
.netでも同じようにできるんでしょうかね。
月曜日に試してみます。

wood 2004/12/20(月) 08:08:07
「CRecordsetのサブクラス」データベースへの自動接続はしてくれません
何かの勘違いだと思います
CDATABASE クラスが接続を掌っているはずです
CRecordset はテーブルに対するアクションおよび属性設定等を管理しているはずです

omiomi 2004/12/20(月) 20:15:43
[[解決]]
.netでもできました。

>CDATABASE クラスが接続を掌っているはずです
CRecordset はテーブルに対するアクションおよび属性設定等を管理しているはずです

そのとおりですが、CRecordsetのクラスをウィザードで作ると、
そのクラス内にDatabaseオープン処理が記述され、
自分でCDatabaseをオープンしなくてすみます。

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

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