Date: Tue, 13 Sep 2005 13:11:48 +0900
From: "Akira Horikawa" <who@example.ne.jp>
堀川です、こんにちは
-----Original Message-----
From: Michio Taniguchi [mailto:who@example.co.jp]
Sent: Monday, September 12, 2005 11:48 AM
To: ML MSDE Fun Club
Subject: [ml-msde-beg:01654] カーソルで更新
>Access2000ADP+MSDE2000RelAで開発しています。
>初歩的な質問ですがストアドで Select したレコードセットには更新は
>出来ないのでしょうか?
接続オブジェクト、正確には、OLE-DBプロバイダが、ストアドプロシージャ
経由の更新をサポートしているかどうかになります。
この辺の仕様は、どこにも公開されていないですが(見つけられないですが)
Accessでは、ストアドに連結した更新フォームが作成できますので、
ストアド経由によるレコード更新は不可能ではありません。
MsgBox CurrentProject.Connection.ConnectionString
を実行すると、Accessが採用しているOLE-DBプロバイダがわかります。
それを見ると、
Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=False;
Data Source=サーバー名;Integrated Security=SSPI;Initial Catalog=DB名;
Data Provider=SQLOLEDB.1
のように表示され、SQLServer標準のSQLOLEDBプロバイダではなく、
独自のプロバイダが使われていることがわかります。
その中の下請けプロバイダに、SQLOLEDBが指定されます。
そこで接続文字列を、この文字列に一致させて下さい。
Dim cn As New ADODB.Connection
Dim conStr As String
conStr = CurrentProject.Connection.ConnectionString
cn.ConnectionString = conStr
cn.Open
このように開いた接続オブジェクト経由では、ストアドプロシージャが返す
レコードセットを使ったレコードの更新や挿入などができるようになります。
ただこのプロバイダ(Microsoft.Access.OLEDB)の詳しい仕様の
ドキュメントは見つからないので、エラーが発生したときの対処は
難しいと思います
Sub test()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim conStr As String
Debug.Print CurrentProject.Connection.ConnectionString
conStr = CurrentProject.Connection.ConnectionString
cn.ConnectionString = conStr
cn.Open
cn.Execute "create table #tmp( id int primary key , dt varchar(80) )"
cn.Execute "insert into #tmp(id,dt) values(1,'A')" & vbCrLf & _
"insert into #tmp(id,dt) values(2,'B')" & vbCrLf & _
"insert into #tmp(id,dt) values(3,'C')"
cn.Execute "create proc #sp_test " & vbCrLf & _
"as " & vbCrLf & _
" set nocount on " & vbCrLf & _
" select * from #tmp"
rs.Open "exec #sp_test", cn, adOpenForwardOnly, adLockOptimistic
Do Until rs.EOF
Debug.Print rs![id] & ":" & rs![dt]
rs![dt] = "更新します:" & rs![dt]
rs.Update
rs.MoveNext
Loop
'レコード挿入
rs.AddNew
rs![id] = 100
rs![dt] = "レコードを新しく登録します"
rs.Update
rs.Close
'レコードの更新状況の確認
rs.Open "exec #sp_test", cn, adOpenForwardOnly, adLockOptimistic
Do Until rs.EOF
Debug.Print rs![id] & ":" & rs![dt]
rs.MoveNext
Loop
rs.close
Set rs = Nothing
'一時オブジェクトを削除します
cn.Execute "drop proc #sp_test"
cn.Execute "drop table #tmp"
'接続を閉じる
cn.Close
Set cn = Nothing
End Sub
上記例題を、Accessプロジェクトの標準モジュールで実行して見て下さい
一時ストアドを使って、一時テーブルのレコードの更新と追加ができるのが
確認できます
------------------------------------
Epata-IT/日本技術ソフト開発
堀川 明 (Akira Horikawa)
09月13日(火曜日) 13時11分記
mailto:who@example.ne.jp
http://www.horikawa.ne.jp/msde/
[MSDE/SQLServerに関して、今、どんなことにお困りですか?] |
よろしければお困りの内容を、電子メールで教えて下さい。 |
質問を電子メールで作成する
|
[ウィンドを閉じる][MSDE/SQLServer FAQ ][MSDE / MSDE2000 技術サポート情報一覧]
|