- ベストアンサー
セレクトしたデータの更新方法について
- セレクトしたデータを更新させるにはどうしたらよろしいのでしょうか?セレクトしたデータをそのまま更新させようとしているからいけないのでしょうか?
- <% Dim DB,Rs,Cmd Set DB = Server.createobject("ADODB.Connection") On error Resume Next DB.open "mysql" DB.BeginTrans Set Cmd=Server.createobject("ADODB.command") Cmd.activeconnection=db Cmd.commandtext="select * from stb where id =1" Set Rs = Cmd.Execute i=cint(1) j="ADSL" Do until Rs.eof Rs("id"),value= i Rs("name").value= j Rs.update If DB.Errors.Count >0 then DB.Rollbacktrans response.write "エラー" for idx = 0 to 2 Response.write db.errors(idx).Description & "<br>" next else DB.commitTrans response.write "データが登録されました。" end if Rs.movenext Loop Rs.close DB.close set Cmd = Nothing set Rs = Nothing set db = Nothing %>
- 上記のコードを使用して、セレクトしたデータを更新させることができます。セレクトしたデータをそのまま更新させようとするとエラーになることもあるので、注意が必要です。データベースの接続、トランザクションの開始、コマンドの作成、クエリの実行などの手順が必要です。エラーが発生した場合はトランザクションをロールバックし、エラーメッセージを表示します。正常に更新が完了した場合はトランザクションをコミットし、成功メッセージを表示します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
いきなりUpdate文を発行してはいけないのでしょうか? Update stb set name = 'ADSL' where id = 1 処理内容をみるに、Selectする必要性が感じられないのですが。 掲載内容を直すのであれば、 Rs("id"),value= i ↓ Rs("id").value= i で大丈夫かと。
その他の回答 (2)
- Kuppycat
- ベストアンサー率50% (109/216)
RecordsetのLockTypeがReadOnlyになっているみたいです。 こちらで試してみましたが、変更することができず、更新できませんでした。 DB.ExecuteでUpdate文を投げる方法がやはり無難かもしれません。 回答ならずすみませんでした。 追記。 Loopの外でBeginTransをしている場合、RollbackTrans、CommitTransもLoopの外で行うようにしてくださいね。
- Kuppycat
- ベストアンサー率50% (109/216)
#1です。 id=1の条件でSelectしているので、Recordsetに入ってくるデータはid=1のデータのみですよね。 なので、Selectする必要はなく、直接Updateを発行してしまえばよいのでは? と思ったわけです。 Select→RecordsetでUapdateだと2度手間になってしまうじゃないですか。 Updateの発行はこの場合、 db.Execute("Update stb set name = 'ADSL' where id = 1") だけでできたと。 whereでid=1と条件つけていますから、この条件にあったデータのみUpdateされます。
補足
回答ありがとうございます。 すこし長いのですが、教えて頂きたいことがあります。 txtファイルには 1,ADSL 2,ISDN といったデータが入ってます。 データベースは ID,NAMEになっています。 Update set のSQL分では更新させることができましたが、 Rs("id")=arystr(0) Rs("name")=arystr(1) Rs.update の場合では更新されません、 何故なのでしょうか? また、Rs("id")=arystr(0) Rs("name")=arystr(1) Rs.update の場合を利用して更新させるには どうやれば更新させることができますか? 教えてください。 よろしくお願いします。 <% Dim DB,Rs,Cmd Set DB = Server.createobject("ADODB.Connection") On error Resume Next DB.open "mysql" DB.BeginTrans Set Rs=Server.createobject("ADODB.Recordset") Set Cmd=Server.createobject("ADODB.command") Cmd.activeconnection = DB cmd.commandtext="select * from stb where id =?" set fs = Server.createobject("scripting.filesystemobject") set ts=fs.opentextfile(Server.Mappath("test.txt"),1) Set Para=Cmd.createParameter("id",2,1,10) Cmd.Parameters.append(Para) do while Not ts.atendofstream arystr=split(ts.Readline,",") Para.value=arystr(0) set Rs=Cmd.execute Do until Rs.eof Rs("id")=arystr(0) Rs("name")=arystr(1) Rs.update If DB.Errors.Count >0 then DB.Rollbacktrans response.write "エラー" for idx = 0 to 2 Response.write db.errors(idx).Description & "<br>" next else DB.commitTrans response.write "データが登録されました。" end if Rs.movenext loop loop Rs.close DB.close set Rs = Nothing set db = Nothing %>
お礼
回答ありがとうございます。 それではデータが更新されませんでした。 CMDの処理をRecordsetに変更してコードを書いたら 正常に動作しました。 よくわかりませんが、CMDの処理で、データ更新はできるのでしょうか?
補足
SelectしたのはSelectした行を更新させたいからです。 Update stb set name = 'ADSL' where id = 1にしたら Selectしなくても、Selectしてくれますが Rs("id").value= i Rs("name").value=j Rs.update の場合だとSELECTしないと、Idにあったデータを更新 してくれないと考えたからです。 他に方法があればぜひ教えてください。