

VB6 + SQL サーバー 2000 でDB接続を行っていますが
リストのように SELECT 文の後にInsert 文を実行しようとし
Re.Closeを実行すると
-------------------------------------------------------------
実行時エラー '3704':
オブジェクトが閉じている場合は、操作は許可されません
-------------------------------------------------------------
とエラーになり、連続するSQL文を実行する場合のopen ,Close は
どのように書けばよろしいのでしょうか。
ネット上で見つけた資料によるとメソッド RE.CancelUpdate を使うと
ありましたがこれもエラーとなります。
どなたか 教えていただけないでしょうか。
--- sample ----------------------------------------
Dim Cn As New ADODB.Connection
Dim Re As New ADODB.Recordset
Connect = ""
Connect = "Provider = SQLOLEDB;" _
& "Data Source = サーバー;" _
& "User ID = sa;" _
& "Password = パスワード;" _
& "initial Catalog = database;"
'
Cn.Open Connect
'
strSQL = "SELECT * from DBTBL WHERE CODE = '000001'"
Re.Open strSQL, Cn, adOpenKeyset 'SQL文を実行
Re.Close
'
strSQL = "Insert Into MAS1PF (CODE,NAME,TEL,FAX) Values('11111','名前','TEL,'FAX)"
Re.Open strSQL, Cn, adOpenKeyset 'SQL文を実行
'
Re.Close
Cn.Close
No.1ベストアンサー
- 回答日時:
1:strSQL = "SELECT * from DBTBL WHERE CODE = '000001'"
2:Re.Open strSQL, Cn, adOpenKeyset 'SQL文を実行
3:Re.Close
4:strSQL = "Insert Into MAS1PF (CODE,NAME,TEL,FAX) Values('11111','名前','TEL,'FAX)"
5:Re.Open strSQL, Cn, adOpenKeyset 'SQL文を実行
の 3: で Re.Close したまま、5: で Re.Open しているからだと思います。
5: の前に
Set Re = New ADODB.Recordset
を入れると正常に動作するようになると思います。
ちなみに、なぜ 2: ではエラーが発生しないかというと、
Dim Re As ADODB.Recordset
ではなく、
Dim Re As New ADODB.Recordset
として宣言しているからです。
この回答への補足
tukasa-12r さんありがとうございます。早速 試してみたのですが同じエラーが発生します。
Dim Cn1 As New ADODB.Connection
Dim Re As ADODB.Recordset
vProv = "Provider = SQLOLEDB;" _
& "Data Source = サーバー;" _
& "User ID = sa;" _
& "Password = パスワード;" _
& "initial Catalog = database;"
Cn1.Open vProv 'Db OPEN
strSQL = "SELECT * from DBTBL WHERE CODE = '000001'"
Re.Open strSQL, Cn, adOpenKeyset 'SQL文を実行
Re.Close
strSQL = "Insert Into MAS1PF (CODE,NAME,TEL,FAX) Values('11111','名前','TEL,'FAX)"
Set Re = New ADODB.Recordset
Re.Open strSQL, Cn, adOpenKeyset 'SQL文を実行
Re.Close ← ここでエラー 3704 がでます
もう少し教えていただけないでしょうか。
insert,update,delete の場合は Execute を使いなさいと文書を
見つけました。
Executeだと re.close は不要との記述もありました。
試したところイメージ通りの処理ができていますので、これでやってみようと
思います。
本当にありがとうございました。
No.2
- 回答日時:
Private Sub Command1_Click()
Dim strSQL(1) As String
strSQL(0) = "INSERT INTO Table1 (ID, 顧客名) VALUES (3, 'AAA')"
strSQL(1) = "INSERT INTO Table1 (ID, 顧客名) VALUES (4, 'BBB')"
CnnExecute strSQL(0)
CnnExecute strSQL(1)
End Sub
No1さんの回答で不具合自体は解消されています。
が、幾つか改善すべき点もあるようです。
CnnExecute関数は、conCNNSTRING を SQL Server 2000 のそれに変更しての動作確認も済んでいます。
改善点1、ADODB のエラー管理を行う。
改善点2、トランザクションのロールバックも行う。
なお、Set cnn = New ADODB.Connection を複数回実行するのであれば関数にすればよい。
そうすれば、 Command1_Click() のように非手続き的に安直の書くことも可能。
Const conCNNSTRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\db1.mdb"
Public Function CnnExecute(ByVal strSQL As String) As Boolean
On Error GoTo Err_CnnExecute
Dim isOK As Boolean
Dim cnn As ADODB.Connection
isOK = True
Set cnn = New ADODB.Connection
With cnn
.Errors.Clear
.ConnectionString = conCNNSTRING
.Open
.BeginTrans
.Execute strSQL
.CommitTrans
End With
Exit_CnnExecute:
On Error Resume Next
CnnExecute = isOK
Exit Function
Err_CnnExecute:
isOK = False
If cnn.Errors.Count > 0 Then
ErrMessage cnn.Errors(0), strSQL
cnn.RollbackTrans
Else
MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _
vbExclamation, " 関数エラーメッセージ"
End If
Resume Exit_CnnExecute
End Function
Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)
MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _
"・Err.Description=" & CnnErrors.Description & Chr$(13) & _
"・Err.Number=" & CnnErrors.Number & Chr$(13) & _
"・SQL State=" & CnnErrors.SQLState & Chr$(13) & _
"・SQL Text=" & strSQL, _
vbExclamation, " ADO関数エラーメッセージ"
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
実行時エラー 3265「要求された名前、または序数
Visual Basic(VBA)
-
SQLのエラー(~付近に不適切な構文があります)
SQL Server
-
VB6.0(SP6)にて開発を行なっています。参照設定に関して教えてく
IT・エンジニアリング
-
-
4
ADO VBA 実行時エラー3021
Visual Basic(VBA)
-
5
実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」
Visual Basic(VBA)
-
6
実行時エラー 438になった時の対処法を教えて下さい。
Visual Basic(VBA)
-
7
以下のコードを実行しても、オブジェクト変数または、withブロック変数が設定されていませんとエラーが
Visual Basic(VBA)
-
8
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
9
regsvr32で登録された一覧を知りたい
UNIX・Linux
-
10
ADOからのストアド実行でエラーが発生します
SQL Server
-
11
ASPからSELECT文を複数発行するには?
Microsoft ASP
-
12
クラシックASPでのエラー処理について
Microsoft ASP
-
13
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
14
access vbaにてテンポラリーテーブルが作りたいです。
Access(アクセス)
-
15
VBAでアクセスDBからデータの取得について
Visual Basic(VBA)
-
16
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
17
SQLを連続発行する時の正しい(?)書き方は?
Visual Basic(VBA)
-
18
レコードが存在しなかった場合
Microsoft ASP
-
19
実行時エラー -2147217900 ADODBでレコードセットオープン時エラー
Access(アクセス)
-
20
sqlserverで集計結果をUPDATEしたいです
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
VBAがブレークモードになっ...
-
INSERT INTOステートメント構文...
-
VB.netでのオートフィルタについて
-
【マクロ】エラー【#DIV/0!】が...
-
Invalid procedure call or arg...
-
[Delphi] データセットは閉じて...
-
excel vbaでvlooupの変数がわか...
-
【Excel VBA】マクロをボタンに...
-
EXCEL/VBAで、自分のPCだけエラ...
-
実行時エラー3001「引数が間違...
-
ACCESSのエラーで困っています
-
カーソルオープンでエラー(ORA...
-
Outlook.ApplicationをCreateOb...
-
VB6+SQL サーバー 2000 で 実行...
-
VBで構造体を使うさ際の64k...
-
職場から目的地までの距離集計
-
ADODB.Streamを使用してUTF-8を...
-
ワードで「エラーブックマーク...
-
Excel VBA ハイパーリンクの追...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
VBAがブレークモードになっ...
-
実行時エラー -'-2147417848
-
【マクロ】エラー【#DIV/0!】が...
-
なぜこんな初歩的なVBAのIf文で...
-
マクロについて教えてください...
-
VBAでのエラー
-
ExcelVBA Range クラスの Page...
-
実行時エラー48発生時のDLL特定...
-
実行時エラー3001「引数が間違...
-
VBAで、定数式が必要ですのエラ...
-
Outlook.ApplicationをCreateOb...
-
あとこれさえ出来ればよいので...
-
VB6+SQL サーバー 2000 で 実行...
-
VBS実行時エラー オブジェクト...
-
EXCEL/VBAで、自分のPCだけエラ...
-
EXCEL VBAマクロ中断でデバッグ...
-
VBAのエラー発生場所をメッセー...
-
なぜエラーになるのでしょうか...
-
Invalid procedure call or arg...
おすすめ情報