ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4021391 DAOでのOpenRecordsetの方法
質問者:kmor SQLServerのDBをDAOを使って更新しようとしていますが、方法がわからず困っています。
-------------------
private Cn as DAO.Database
private function fnc1() as integer
Dim ws As DAO.Workspace
Dim rcdst1 As DAO.Recordset
dim strCnct As String
dim strSQL As String

strCnct = "ODBC;Driver={SQL Server};SERVER=" & g_strSVName & ";DATABASE=" & g_strDBName & ";UID=" & strpUserID & ";PWD=" & strpPassword & ";"
'DB接続
Set Cn = ws.OpenDatabase("", False, False, strCnct)
strSQL = "SELECT * FROM Table1"
Set rcdst1 = Cn.OpenRecordset(strSQL, dbOpenDynaset, dbDenyWrite, dbOptimistic)
-------------------------------------
このOpenRecordsetで
ODBC--すべてのレコードをロックできません。(3254)
のエラーが出ます。
また、OpenRecordsetを
Set rcdst1 = Cn.OpenRecordset(strSQL, dbOpenDynaset)
とすると
rcdst1.Edit

データベースまたはオブジェクトは読み取り専用なので、更新できません。
のエラーが出ます。

どうしたらいいでしょうか。
困り度:
  • すぐに回答を!
質問投稿日時:
08/05/14 12:33
最新から表示回答順に表示

回答

ANo.2 ADOで解決したみたいですが、DAOでODBC接続して更新するにはODBC Directを用いる必要があります。

こんな感じです
Dim Cn As DAO.Connection
Dim ws As DAO.Workspace
Dim rcdst1 As DAO.Recordset
Dim strCnct As String
Dim strSQL As String

strCnct = "ODBC;Driver={SQL Server};SERVER=(local);DATABASE=pubs;UID=xxx;PWD=xxx;"
'DB接続
Set ws = DBEngine.CreateWorkspace("", "", "", dbUseODBC)
Set Cn = ws.OpenConnection("", False, False, strCnct)
strSQL = "SELECT * FROM Table1"
Set rcdst1 = Cn.OpenRecordset(strSQL, dbOpenDynaset, dbExecDirect, dbOptimistic)

rcdst1.AddNew
rcdst1!ID = 1
rcdst1!Name = "aaa"
rcdst1.Update

http://msyk.net/vb5db/ODBCDirect.html
http://www.ie.reitaku-u.ac.jp/~ykago/lectures/db/dao/dao05.html
回答者:nora1962
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/14 22:02
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.1 ぱっと見、問題なさそうなコードなんですが。

よくあるのは、DBそのものを誰かが先に掴んでいるという場合です。
既に業務用か何かのプログラムが、そのDBを排他的に開いてないですか?
また、自分自身のプログラムが「閉じ忘れ」ってのも結構ありますよ。

なんとなく、DB側に問題があるような気がしたもので。
回答者:FEX2053
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/14 13:03
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼ですよね...

とりあえずADOでやればできるのでそのように変更しました。
ありがとうございました。
最新から表示回答順に表示