対象となる複数データ抽出後の一括更新について – プログラミング – Home

対象となる複数データ抽出後の一括更新に...
 
通知
すべてクリア

[解決済] 対象となる複数データ抽出後の一括更新について


おっか
 おっか
(@おっか)
ゲスト
結合: 22年前
投稿: 34
Topic starter  

皆様こんにちは、
いつもお世話になっております。
下記の件、お手数ですがご回答頂ければ
幸いです。

内容としましては、
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();
}


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

CRecordsetにはSetFieldValueのようなものは無いようですね。

DDXを使うか、UPDATE文で更新するかのどちらかでしょう。
・DDXの場合
「クラスの追加」でCRecordsetの派生クラスを追加します。
・UPDATE文の場合
SQLのUPDATEについて調べてください。


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

> 一括更新したい
>
こういうSQLって、ダメなんだっけ・・・?
趣旨とあってます?

UPDATE test1 SET UsrId=値1, KouShinDate=値2
WHERE Kigen = (SELECT Kigen FROM test2);


返信引用
おっか
 おっか
(@おっか)
ゲスト
結合: 22年前
投稿: 34
Topic starter  

早速の御返答有難うございます。

前記の処理には書いてありませんでしたが、
実際には、レコード内容を変更し、
他のテーブルにレコードを履歴として追加
しなければなりません
ですので、
できればレコードの修正、追加を
ほぼ同時、前記対象レコード毎に
履歴を残す形で処理をしたいのですが
また、SetLockingModeの引数
pessimisticとoptimisticの
値は何でしょうか。
指定すると、定義されていないとでます


返信引用
おっか
 おっか
(@おっか)
ゲスト
結合: 22年前
投稿: 34
Topic starter  

CanUpDate()が真になる為の

CDatabase
CRecordsetの設定は

db.openEx(strCon,NULL);
rs.Open( CRecordset::dynaset,strSql,CRecordset::none);
でよろしいのでしょうか?


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

結局、最初の問題は解決したのでしょうか?
後続の質問は何か最初の問題に関連しているのでしょうか?


返信引用
おっか
 おっか
(@おっか)
ゲスト
結合: 22年前
投稿: 34
Topic starter  

すいません
まだ、解決しておりません。

データを更新して、別テーブルにレコードを追加といった
仕様にしたいのですが、その際に
CanUpDateで更新可能か
確認しているのですが、
うまく更新可能にならない為
CDatabase,CRecordsetの指定に
問題があるのか、他に問題があるのかわかりません。
また、テーブル更新を行う為に
テーブルはClaswizardでCRecordsetを基本クラスと
しておりますが、この指定に関して問題ありますでしょうか


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

Openで読み取り専用を指定していないならば、
後は、データソースが読取専用になっている可能性があります。
ODBCの設定とか、DBサーバーのユーザーの権限とか、
複数テーブルの連結ビューを更新できるのかとか、
を調べてみてはいかがでしょう。


返信引用
おっか
 おっか
(@おっか)
ゲスト
結合: 22年前
投稿: 34
Topic starter  

dairygoodsさん
度々すいません。
SQLクエリアナライザでは、
できるのですが。
VC++では同一ユーザで処理できないって
ことはあるのでしょうか。


返信引用
おっか
 おっか
(@おっか)
ゲスト
結合: 22年前
投稿: 34
Topic starter  

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();
においてどの設定が原因でレコードセットが読み込み専用になってしまうのでしょうか?


返信引用
おっか
 おっか
(@おっか)
ゲスト
結合: 22年前
投稿: 34
Topic starter  

他の議題での解決いたしました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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