セレクトしたデータの更新方法について

このQ&Aのポイント
  • セレクトしたデータを更新させるにはどうしたらよろしいのでしょうか?セレクトしたデータをそのまま更新させようとしているからいけないのでしょうか?
  • <% 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 %>
  • 上記のコードを使用して、セレクトしたデータを更新させることができます。セレクトしたデータをそのまま更新させようとするとエラーになることもあるので、注意が必要です。データベースの接続、トランザクションの開始、コマンドの作成、クエリの実行などの手順が必要です。エラーが発生した場合はトランザクションをロールバックし、エラーメッセージを表示します。正常に更新が完了した場合はトランザクションをコミットし、成功メッセージを表示します。
回答を見る
  • ベストアンサー

セレクトしたデータを更新させるにはどうしたらよろしいのでしょうか?

更新されません。 セレクトしたデータをそのまま更新させようとしているからいけないのでしょうか? <% 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 %>

質問者が選んだベストアンサー

  • ベストアンサー
  • Kuppycat
  • ベストアンサー率50% (109/216)
回答No.1

いきなりUpdate文を発行してはいけないのでしょうか? Update stb set name = 'ADSL' where id = 1 処理内容をみるに、Selectする必要性が感じられないのですが。 掲載内容を直すのであれば、 Rs("id"),value= i ↓ Rs("id").value= i で大丈夫かと。

sea_clear
質問者

お礼

回答ありがとうございます。 それではデータが更新されませんでした。 CMDの処理をRecordsetに変更してコードを書いたら 正常に動作しました。 よくわかりませんが、CMDの処理で、データ更新はできるのでしょうか?

sea_clear
質問者

補足

SelectしたのはSelectした行を更新させたいからです。 Update stb set name = 'ADSL' where id = 1にしたら Selectしなくても、Selectしてくれますが Rs("id").value= i Rs("name").value=j Rs.update の場合だとSELECTしないと、Idにあったデータを更新 してくれないと考えたからです。 他に方法があればぜひ教えてください。

その他の回答 (2)

  • Kuppycat
  • ベストアンサー率50% (109/216)
回答No.3

RecordsetのLockTypeがReadOnlyになっているみたいです。 こちらで試してみましたが、変更することができず、更新できませんでした。 DB.ExecuteでUpdate文を投げる方法がやはり無難かもしれません。 回答ならずすみませんでした。 追記。 Loopの外でBeginTransをしている場合、RollbackTrans、CommitTransもLoopの外で行うようにしてくださいね。

  • Kuppycat
  • ベストアンサー率50% (109/216)
回答No.2

#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されます。

sea_clear
質問者

補足

回答ありがとうございます。 すこし長いのですが、教えて頂きたいことがあります。 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 %>

関連するQ&A

  • Access2000のデータをASPで表示させるには?

    間違ってソースを全部消してしまって、記憶を頼りに戻してみたのですが、Accessのデータの表示方法がわからなくなってしまいました。 ↓これがそのソースです <%@ LANGUAGE="VBScript" %> <% Option Explicit %> <Html> <Head> </Head> <Body> <% Dim db,rs,sql Set db = Server.CreateObject("ADODB.Connection") db.Open ("db1")←データベース名入れるんですよね? sql = "Select id,namae,n_yomigana,juusyo,j_yomigana From table1 where db1" Set rs = db.Execute (sql) Response.Write rs.fields("id") Response.Write "<br>" Response.Write rs.fields("namae") Response.Write "<br>" Response.Write rs.fields("n_yomigana") Response.Write "<br>" Response.Write rs.fields("juusyo") Response.Write "<br>" Response.Write rs.fields("j_yomigana") Response.Write "<br>" rs.close db.close %> </Body> </Html> ソースを丸ごと載せてしまってごめんなさい、読みにくいですよね。 足りないところや直し方が思い出せなくて困っています。 ご迷惑おかけしますが、アドバイスお願いします。

  • DBの更新??

    ソースは下記です。 Set db=Server.CreateObject("ADODB.Connection") db.Provider="Microsoft.Jet.OLEDB.4.0" db.Mode=2 db.ConnectionString=Server.MapPath("../../script/db_dat/crv_haken.mdb") db.Open Set rs=db.Execute("select * from control " ) rs("day-upd") = Request.Form("編集担当") rs("tanto-upd") = date rs.update rs.Close db.Close Set db=Nothing で・・・実行しますと エラー タイプ ADODB.Recordset (0x800A0CB3) 現在の Recordset は更新をサポートしていません。プロバイダか、選択されたロックタイプの限界の可能性があります。 のメッセージがでます。 何が原因でしょうか?お教えください。

  • ページング値渡しについて

    sea_clear_sky8です。 [環境] OS 98SE PWS [質問内容] ページングの値渡しの際がうまくいきません。 忙しいところすいませんがよろしくお願いします。 次のページっていうのをボタンで作って、次の10件が表示させるように させたいのです。 下記ソースのvar frm = document.GetElemntById("myForm");の部分で オブジェクトでサポートされていないプロパティまたはメソッド ですとエラーがでます。 それからコンパイル後、SQLエラーと表示されます。 このSQLエラーというのは下記ソースのエラー処理で行っている SQLエラーというのが表示されています。 [ソース] [bunkatsu1.html] <html> <body> <form action="bunkatsu1.asp" method="post"> 名前:<input type="text" name="nm"> <input type="hidden" name="page_num" value="0"> <input type="submit" name="exec" value="検索"> </form> </body> </html> [bunkatsu1.asp] <html> <script type="text/javascript"> <!-- function myClick() { var frm = document.GetElemntById("myForm"); frm.action ="bunkatsu1.ASP"; frm.method= "get"; frm.submit(); } // --> </script> <body> <% On Error Resume Next Dim DB,CMD,RS,AllCnt '接続処理 Set DB = Server.CreateObject("ADODB.Connection") DB.Open "mysql" If Err.number <> 0 then Response.Write "接続エラー" Response.End End If ' LIMITを使ったSELECT文を実行 Set CMD = Server.CreateObject("ADODB.Command") CMD.ActiveConnection = DB CMD.CommandText = "select * from test_t " & _ "where name like '%" & Request("nm") & "%' " & _ "order by id " & _ "limit " & Request("page_num")*10 & ",10" Set RS = CMD.Execute If Err.number <> 0 then Response.Write "SQL実行エラー" Response.End End If ' 結果出力 Response.Write "<table border=1>" Response.Write "<tr><td>id</td><td>name</td></tr>" Do Until RS.EOF Response.Write "<tr>" Response.Write "<td>" & RS("id") & "</td>" Response.Write "<td>" & RS("name") & "</td>" Response.Write "</tr>" RS.MoveNext If Err.number <> 0 then Response.Write "次データ取得エラー" Response.End End If Loop Response.Write "</table>" ' 検索条件に該当する全データの件数取得 CMD.CommandText = "select count(*) from test_t " & _ "where name like '%" & Request("nm") & "%' " Set RS = CMD.Execute If Err.number <> 0 then Response.Write "SQL実行エラー" Response.End End If AllCnt=RS(0) ' ページ数表示 if AllCnt>10 then Response.Write Abs(Int(-1*(AllCnt/10))) & "ページ中の" Response.Write Request("page_num")+1 & "ページ目を表示<br>" end if ' 前の10件 if Request("page_num")<>0 then end if ' 次の10件 if ((Request("page_num")+1)*10) < AllCnt then response.write "<form id=""myForm"" method=""post"">" response.write "<input type=""Submit"" value=""次の10件&gt;"" onclick=""myClick();"">" response.write "<input type=""HIDDEN"" name=""num"" value=""&request(""num"")&"">" このTEXTボックスはHIDDENのNUMに何が入っているか確認するための ものです。 response.write "<input type=""text"" name=""test"" value=""&=request(""num"")&"">" response.write "<input type=""HIDDEN"" name=""page_num"" value=""&request(page_num)+1&"">" このTEXTボックスはHIDDENのPAGE_NUMに何が入っているか確認するための ものです。 response.write "<input type=""text"" name=""test1"" value=""request(page_num)+1&"">" response.write "<input type=""submit"" value=""更新"">" response.write "</form>" end if ' レコードセット解放 RS.Close ' 切断 DB.Close ' オブジェクト解放 Set CMD=Nothing Set RS=Nothing Set DB=Nothing %> </body> </html> 忙しいところすいませんが、ご教授願います。 よろしくお願いします。

  • SQL文が実行できません

    単純なSQLの実行命令なのですが、 下記のエラーメッセージが出て実行できません。 解消方法をご存知の方がいらっしゃいましたら、 教えてください。よろしくお願いします。 エラーメッセージ: Microsoft OLE DB Provider for ODBC Drivers (0x80040E10) [Microsoft][ODBC Microsoft Access Driver] パラメータが少なすぎます。1 を指定してください。 /x_db/1.asp, line 12 (Set RS = db.Execute(SQL)のラインがエラーです) ソースです。 <% Set db = Server.CreateObject"ADODB.Connection") db.Open "x_db" SQL = "select * from x_db where w_xpc ='" & Request.Form("F01") &"'" Set RS = db.Execute(SQL) Response.Write(RS.Fields("氏名")) RS.close set RS = nothing db.close set db = nothing %> 環境:WIN200server IIS5.0 access97

  • ACCESS2010でSELECTの問題

    ACCESS初心者です。 既にレコードが存在すテーブルで、DBを更新モードで開き、SELECT句を実行すると、更新モードから読み込みモードになり、更新/追加ができなく困っています。 以下にサンプルコーディングを掲載します。 SQLを実行する前と、実行後に  LockType を表示したところ、  実行前は「3」更新可  実行後は「1」更新不可 となります。 どのようにすれば「LockType」が変らないようにできるでしょうか。 よろしくお願いします。 ---------------------------------------------------------------------------------------------------------------------- Dim cmd As New ADODB.Command Dim rs_issues As ADODB.Recordset Dim adoCn As Object 'ADOコネクションオブジェクト Set adoCn = CreateObject("ADODB.Connection") 'ADOコネクションオブジェクト adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & "データベース名" Set cmd = New ADODB.Command Set cmd.ActiveConnection = adoCn Set rs_issues = New ADODB.Recordset rs_issues.Open "T_issues", db, adOpenDynamic, adLockOptimistic cmd.CommandText = "SELECT *FROM T_issues WHERE i_チケット番号=123456"   Debug.Print rs_issues.LockType   '(1)LockType=3 Set rs_issues = cmd.Execute Debug.Print rs_issues.LockType   '(1)LockType=1

  • Response.Writeを使用して更新するには

    いつもお世話になってます。 前のページでIDで検索し、更新ボタンをクリックするとkousin.aspへ表示しているIDのレコードをそのまま表示して更新をしたいのですがうまくいきません。 Response.Writeのせいでしょうか?宜しくお願いします。 <%@LANGUAGE="VBSCRIPT"%> <% Dim ObjConn,ObjRS pickup = Request.Form("uID") MSACFN = Server.MapPath("dbname.mdb") DBFile="Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & MSACFN Set ObjConn = Server.CreateObject("ADODB.Connection") Set ObjRS = Server.CreateObject("ADODB.Recordset") ObjConn.Open DBFile sql="select * from tablename where uID = '"&pickup&"'" Set DBexe = ObjConn.Execute(sql) ObjRS.CursorLocation = 3 ObjRS.Open "select * from tablename" ,ObjConn,3,3 Response.Write "<form method=""POST"" action=""kousin.asp"">" Response.Write "<table width=""519"" border=""1"">" Response.Write "<tr>" Response.Write "<tr><td>" & ("ID") & "</td><td>" & ObjRS("uID") & "</td></tr>" Response.Write "<tr><td>" & ("氏名") & "</td><td>"& ObjRS("uNAME") & "</td></tr>" Response.Write "<tr><td>" & "<input type=""hidden"" value=""uID""><input type=""submit"" value=""更新"" onClick='return checkForm()'><input type=""button"" onclick=""del.asp""name=""削除"" value=""削除""></td>" Loop Response.Write "</table>" ObjRS.close Set ObjRS=Nothing ObjConn.close Set ObjConn=Nothing %>

  • ASPでRecordCountが使用できない

    Accessの100件のデータを10行づつブラウザに表示したいのですが、rs.PageCount、rsRecordCountなど色々と試しましたが正しい結果が得られず 困っています。 rs.AbsolutePage、Rs.PageSizなども試してみましたが、やはり結果は-1しか返されません。 Set db1=Server.CreateObject("ADODB.Connection") db1.Provider="Microsoft.Jet.OLEDB.4.0" db1.ConnectionString=Server.MapPath("../master.mdb") db1.Mode=1 db1.Open ' Set rs1=Server.CreateObject("ADODB.Recordset") Rs1.Pagesize = 5 ' keyword = "ABC" ' SQL1a = "SELECT top 5 * FROM dbFILE WHERE dbTABEL Like '%" & Keyword & "%'" Set Rs1=db1.Execute(SQL1a) Response.Write rs1.PageCount このようなリストで試しています。よき方法があれば是非 教えて下さい。 最終的にはSQL 7.0に置き換える予定です。 宜しく、お願いします。

  • DAOでのコードをADOへ書き直し

    Access2003、WinXPです。 レコードセットの取得関係をDAOで書いていたのですが ADOに途中から変更しました。 変数宣言を Public db As DAO.Database ⇒Public cn As ADODB.Connection Public rs As DAO.Recordset ⇒Public rs As ADODB.Recordset Public Fld As DAO.field  ⇒Public Fld As ADODB.field レコードセット取得を Set db = CurrentDb      Set rs = db.OpenRecordset(strSQL) ↓ Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open strSQL, cn レコードセット クローズを Set rs = Nothing Set db = Nothing ↓ rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing としました。今のところ動いているようですが、 何か勘違い、気をつけないといけない事等ありますでしょうか・・・?

  • エクセルVBAの処理速度アップについて

    以下のエクセルVBAを組んでいるのですが、処理の速度をあげたいです。 無駄な記述があると思うのですが、調べても試行錯誤しても、上手くいきません。 処理速度をあげる記述をご教示願います。よろしくお願い申し上げます。 ※別ファイルのAccessファイルをデータベースとして、「今年」テーブルと、「前年」テーブルそれぞれから条件抽出して、受注数量を合計させるものです。 ※SQLのVBAです。なお、実際ファイルのVBAは、以下記述の5倍量あります(内容は、セル範囲が違うだけで同じ。現在速度:約30秒)。 ※「配列」というのを活用すれば速くなるようなのですが、理解できませんでした。。。 ーーーー【以下、VBA】----------- Sub DSUM集計() Application.ScreenUpdating = False Dim db As ADODB.Connection Dim rs As ADODB.Recordset Dim mySQL As String Dim cmd As ADODB.Command Dim AA As Variant AA = "AND 営業箇所" & Range("C13") & " AND 拒 IS NULL AND 販売伝票 <" & Range("D13") & " AND 品名 " & Range("E13") & " AND 得意先名 " & Range("F13") & " AND 請求先名 " & Range("G13") & " AND 出荷先名 " & Range("H13") Set db = New ADODB.Connection db.Provider = "Microsoft.Ace.OLEDB.12.0" db.Open "\\▲▲▲\ACCESS.accdb" With Worksheets("補助計算") mySQL = " SELECT SUM(受注数量) FROM 今年 " mySQL = mySQL & "WHERE 納入期日=" & Range("B13") & AA Set rs = New ADODB.Recordset Set cmd = New ADODB.Command Set cmd.ActiveConnection = db cmd.CommandText = mySQL Set rs = cmd.Execute Range("I13").CopyFromRecordset rs mySQL = " SELECT SUM(受注数量) FROM 今年 " mySQL = mySQL & "WHERE 納入期日=" & Range("B14") & AA Set rs = New ADODB.Recordset Set cmd = New ADODB.Command Set cmd.ActiveConnection = db cmd.CommandText = mySQL Set rs = cmd.Execute Range("I14").CopyFromRecordset rs mySQL = " SELECT SUM(受注数量) FROM 前年 " mySQL = mySQL & "WHERE 納入期日=" & Range("K14") & AA Set rs = New ADODB.Recordset Set cmd = New ADODB.Command Set cmd.ActiveConnection = db cmd.CommandText = mySQL Set rs = cmd.Execute Range("M14").CopyFromRecordset rs    mySQL = " SELECT SUM(受注数量) FROM 前年 " mySQL = mySQL & "WHERE 納入期日=" & Range("K15") & AA Set rs = New ADODB.Recordset Set cmd = New ADODB.Command Set cmd.ActiveConnection = db cmd.CommandText = mySQL Set rs = cmd.Execute Range("M15").CopyFromRecordset rs rs.Close Set rs = Nothing Set db = Nothing Application.ScreenUpdating = True End With End Sub ーーーーーーーーーーーーーーーーーーーー 以上

  • CMD.Executeの結果をメッセージボックスで表示したい

    Public Sub SQLActionCmd()     Dim CN As ADODB.Connection     Dim CMD As ADODB.Command     Dim MYSQL As String     '接続     Set CN = CurrentProject.Connection     '更新     MYSQL = "SELECT * FROM 名簿 WEHRE 性別 = "男" ;"     Set CMD = New ADODB.Command     CMD.ActiveConnection = CN     CMD.CommandText = MYSQL     CMD.Execute    '終了     Set CMD = Nothing     RS.Close: Set RS = Nothing     CN.Close: Set CN = Nothing    End Sub と言う感じで実際にはAccessのフォームのボタンをクリックしたタイミングでコードをかいているのですが、このCMD.EXECUTEを実行した結果、テーブルに該当データがなければない旨のメッセージボックスを出したいのです。 そういうことは可能でしょうか?

専門家に質問してみよう