ACCESS2010でSELECTの問題

このQ&Aのポイント
  • ACCESS初心者の方が、既にレコードが存在するテーブルでDBを更新モードで開いてSELECT句を実行すると、更新モードから読み込みモードになり、更新や追加ができない問題が発生します。
  • LockTypeの値が実行前は「3」(更新可)であるのに対し、実行後は「1」(更新不可)となっていることが確認されています。
  • 解決策としては、ADODB.RecordsetオブジェクトのLockTypeプロパティを設定することで、問題を回避することができます。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
回答No.2

途中から失礼します。 これ、ADOに参照設定をしていますよね? こんな感じでどうでしょ。 Sub test() Dim rs_issues As ADODB.Recordset Dim adoCn As ADODB.Connection 'ADOコネクションオブジェクト Dim sSql As String Set adoCn = New ADODB.Connection adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _ "データベース名" Set rs_issues = New ADODB.Recordset rs_issues.CursorLocation = adUseClient sSql = "SELECT * FROM T_issues WHERE i_チケット番号=123456" rs_issues.Open sSql, adoCn, adOpenDynamic, adLockOptimistic Debug.Print rs_issues.LockType '(1)LockType=3 rs_issues!あれ = "昼飯" rs_issues!いつ = Now rs_issues.Update rs_issues.Close: Set rs_issues = Nothing Set adoCn = Nothing End Sub

その他の回答 (1)

  • okgoo3
  • ベストアンサー率74% (20/27)
回答No.1

本来 Command オブジェクトや Connection オブジェクトの Excecute メソッドは Access でいう所のアクション クエリのようにレコード操作のためにあり、基本的に結果のレコードセットを返さない事を想定しています。 そのため Execute で返された Recordset オブジェクトは読み取り専用となります。 https://msdn.microsoft.com/ja-jp/library/cc376797.aspx

takechan1117
質問者

お礼

ご回答ありがとうございます。 参考でお知らせいただいた情報は、今回調べた最中に読む機会がありましたが、よく理解できませんでした。 追加の質問で申し訳ないのですが、 テーブルが読み取り専用になった後、テーブルをクローズし、更新モードでオープンすれば読み込んだレコードセットに対して書き込みはできるのでしょか。 よろしくおねがいします。

関連するQ&A

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • ADO 「Set」は使ったほうがいいのでしょうか?

    Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordse End Sub Sub test2() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset End Sub この二つは同じ意味ですか? 「Set」は使ったほうがいいのでしょうか? よろしくお願いします。

  • ストアドプロシージャの処理終了を判定

    OS:windowsXP Pro Access Version:ACCESS2000 AccessVBAでストアドプロシージャを呼び出し処理をしていますが、ストアドプロシージャでの処理終了を判定して、次のステップに移るような処理を考えています。 SQLServerには、ODBC経由で接続しています。 ストアドプロシージャの呼び出しは巧く行くのですが、処理終了が判定できません。 具体的にはどうすればストアドプロシージャの処理の終了を判定することができるのでしょうか?      Dim adoCN As ADODB.Connection Dim str_adoCN As String Dim strCommand As ADODB.Command Dim RS As New ADODB.Recordset str_adoCN = "Data Source='SQL_XXXX'; User ID='XX';Password='XXXXXXXX';" Set adoCN = New ADODB.Connection adoCN.Open str_adoCN Set strCommand = New ADODB.Command Set strCommand.ActiveConnection = adoCN strCommand.CommandText = "Procedure_XXXX" strCommand.CommandType = adCmdStoredProc Set RS = strCommand.Execute() 次の処理....

  • ADOでAccessファイルに接続して、ファイルの

    ADOでAccessファイルに接続して、ファイルの更新日時を取得するには? access2003です、 Private Sub 更新日時を取得() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim MyFileName As String MyFileName = "D:\My Documents\システム.mdb" cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & MyFileName 'ここで更新日時を取得 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub この状態で、更新日時を取得するにはどうすればいいでしょう? ご教授よろしくお願いします。

  • ADO 「認証に失敗しました」

    ADOでデータベースに接続したいのですが ”実行時エラー -2147217843(80040e4d) 認証に失敗しました。” になります。 コードは Sub ado() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source" & CurrentProject.FullName ★ rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub です。 ★ 印の所でエラーになります。 宜しくお願いいたします。

  • DataGridに表示されない

    VB6でMySQL4.1に接続して MySQL内にあるデータベース"sample"の テーブル"総合"をDataGridに表示したいのですが できません。 エラーメッセージは "実行時エラー '7004': 行セットにはブックマークを設定できません" とでます。 どうしたら表示されるのでしょうか? Private Sub form_load() Dim cn As ADODB.Connection 'オブジェクト Dim rs As ADODB.Recordset 'データベースに接続 Set cn = New ADODB.Connection 'データベース:Sheet1 cn.ConnectionString = "Provider=MSDASQL.1;" _ & "Data Source=sample" cn.Open 'レコードセットの取得 Set rs = New ADODB.Recordset rs.ActiveConnection = cn rs.Source = "総合" rs.CursorType = adOpenStatic rs.LockType = adLockOptimistic rs.Open Set DataGrid1.DataSource = rs End Sub

  • 【Access2003】VBAで削除のSQL実行ができない

    初歩的な質問かもしれませんが・・・ ACCESS2003VBAでADOを用いて削除を実行しようとしているのですがエラー(エラーは「オーバーフローしました」です。)が出て実行できません。 ソースは以下の通りです。 Dim strSQL As String Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection strSQL = " DELETE FROM D_TB" rs.Open strSQL, cn, , adOpenStatic, adLockOptimistic       '←ここでエラー Do Until rs.EOF rs.Delete rs.MoveNext Loop rs.Close cn.Close どこがおかしいのでしょうか? 大変困っています。教えてください。よろしくお願いいたします。

  • アクセスでADO 並べ替えが適用できない

    アクセスでADOを使っているのですが、 Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.CursorLocation = adUseClient rs.Open "SELECT * FROM Q1", cn, adOpenStatic, adLockPessimistic rs.Sort = "受付日 DESC" For i = 1 To rs.RecordCount ・ ・ ・ このようなコードを作っていますが、 rs.Sortの部分で、「並べ替えを適用できません」になります。 レコード数は、15000件くらいです。 なぜ並べ替えができないのでしょうか? しょうがないからクエリで最初から並べ替えしておきますが、原因を教えてください。

  • 【ACCESS2000】 VBAの更新処理に条件を加えたい。

    下記のような更新処理のVBAを組みました。 これにIDが5のものを更新するというのを加えるには どうすればよいでしょうか。 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "tbl_D_売上", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect rs("入金方法") = 2 rs("入金方法名称") = "分割" rs.Update rs.Close Set rs = Nothing cn.Close Set cn = Nothing

  • ExcelVBA Accessにデータ書き込み

    VBAでコマンドボタンを押した際に特定のセルの値をAccessDBに入力するプログラムを作りたいのですが、上手くいきません...。 実行した際に「実行時エラー '21472179000 (80040e 14)': オートメーションエラーです。」と表示されます。 また、ステップインで実行してみるとEnd Withのところでエラーが発生します。 恐らくインサート文が間違っていると思うのですが、試行錯誤しても解決できませんでしたので教えて頂きたいです。 以下プログラムです。 Private Sub CommandButton1_Click() Dim cn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset Dim constr As String Dim strSQL1 As String Dim a As String a = Range("A1").Value Dim b As String b = Range("A2").Value Dim c As String c = Range("A3").Value constr = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=~.accdb strSQL1 = "insert into " & _ "TableName (1,2,3) " & _ "values ('" + Range("A1").Value + "','" + Range("A2").Value + "','" + Range("A3").Value + "')" Set cn = New ADODB.Connection cn.ConnectionString = constr cn.Open Set cmd = New ADODB.Command With cmd .ActiveConnection = cn .CommandText = strSQL1 .Execute End With Set cmd = Nothing Set rs = Nothing cn.Close Set cn = Nothing End Sub 以上、宜しくお願い致します。