皆様こんにちは、
いつもお世話になっております。
下記の件、お手数ですがご回答頂ければ
幸いです。
内容としましては、
select文にて絞り込んだデータを一括更新したいといったものです。
下記の例において、
T1とT2の期限が同じ場合において
T1のKigenとKoushinDateの変更を
一括で行うといったものです。
更新処理の仕方を教えていただけますでしょうか。
開発環境は
Win2000, VC++6.0, MFC, SDI,MS SQL7.0の環境です。
strCon = DSN=TESTDB;UID=test;PWD=test;
strSql = select T1.UsrId,T1.Kigen,T1.KouShinDate from test1 T1,test2 T2 ;
strSql +=where T1.Kigen=T2.Kigen;
CDatabase db;
db.OpenEx(strCon,NULL);
db.SetQueryTimeout(60*60*2);
//実行
CRecordset rs( &db );
rs.Open( CRecordset::dynaset,strSql,NULL);
rs.MoveFirst();
while(!rs.IsEOF()){
if(rs.CanUpdate){
rs.Edit();
更新処理
T1.Kigenの内容を更新
T1.KousinDateの内容を更新
}
rs.MoveNext();
}
rs.close();
db.close();
}
CRecordsetにはSetFieldValueのようなものは無いようですね。
DDXを使うか、UPDATE文で更新するかのどちらかでしょう。
・DDXの場合
「クラスの追加」でCRecordsetの派生クラスを追加します。
・UPDATE文の場合
SQLのUPDATEについて調べてください。
> 一括更新したい
>
こういうSQLって、ダメなんだっけ・・・?
趣旨とあってます?
UPDATE test1 SET UsrId=値1, KouShinDate=値2
WHERE Kigen = (SELECT Kigen FROM test2);
早速の御返答有難うございます。
前記の処理には書いてありませんでしたが、
実際には、レコード内容を変更し、
他のテーブルにレコードを履歴として追加
しなければなりません
ですので、
できればレコードの修正、追加を
ほぼ同時、前記対象レコード毎に
履歴を残す形で処理をしたいのですが
また、SetLockingModeの引数
pessimisticとoptimisticの
値は何でしょうか。
指定すると、定義されていないとでます
CanUpDate()が真になる為の
CDatabase
CRecordsetの設定は
db.openEx(strCon,NULL);
rs.Open( CRecordset::dynaset,strSql,CRecordset::none);
でよろしいのでしょうか?
結局、最初の問題は解決したのでしょうか?
後続の質問は何か最初の問題に関連しているのでしょうか?
すいません
まだ、解決しておりません。
データを更新して、別テーブルにレコードを追加といった
仕様にしたいのですが、その際に
CanUpDateで更新可能か
確認しているのですが、
うまく更新可能にならない為
CDatabase,CRecordsetの指定に
問題があるのか、他に問題があるのかわかりません。
また、テーブル更新を行う為に
テーブルはClaswizardでCRecordsetを基本クラスと
しておりますが、この指定に関して問題ありますでしょうか
Openで読み取り専用を指定していないならば、
後は、データソースが読取専用になっている可能性があります。
ODBCの設定とか、DBサーバーのユーザーの権限とか、
複数テーブルの連結ビューを更新できるのかとか、
を調べてみてはいかがでしょう。
dairygoodsさん
度々すいません。
SQLクエリアナライザでは、
できるのですが。
VC++では同一ユーザで処理できないって
ことはあるのでしょうか。
db.ExecuteSQLで
SQLのUPDATE文を書いてみたところ
うまくいきました、
しかしながら
CRecordsetのいまだEDIT、UPDATEが利用できません。
”レコードセットは読込専用です”エラーとなってしまいます。
db.BeginTrans();
sqlwrk=select * from test1 where date>='20030201' and date<='20030228';
rs.Open(CRecordset::dynaset,,CRecordset::none);
db.Committrans();
においてどの設定が原因でレコードセットが読み込み専用になってしまうのでしょうか?
他の議題での解決いたしました。