

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
-
レコードが存在しなかった場合
Microsoft ASP
-
-
4
ADOでレコードを閉じるタイミング。。Access2000/VB6/Win2K
その他(データベース)
-
5
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
6
VB6.0(SP6)にて開発を行なっています。参照設定に関して教えてく
IT・エンジニアリング
-
7
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
8
SQLを連続発行する時の正しい(?)書き方は?
Visual Basic(VBA)
-
9
64bit端末でのOLEDB接続に関して
Oracle
-
10
実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」
Visual Basic(VBA)
-
11
以下のコードを実行しても、オブジェクト変数または、withブロック変数が設定されていませんとエラーが
Visual Basic(VBA)
-
12
Access VBAで行ラベルが定義されていないというエラーが出ます
Access(アクセス)
-
13
データベース操作時エラーについて
Visual Basic(VBA)
-
14
ADOからのストアド実行でエラーが発生します
SQL Server
-
15
accessの SQL文 INSERT命令
Access(アクセス)
-
16
SUBSTRING 関数に渡した長さのパラメータが無効です。
SQL Server
-
17
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
18
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
19
セルの値を取得してSQL文に組み込みたい
SQL Server
-
20
access vbaにてテンポラリーテーブルが作りたいです。
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
VBAがブレークモードになっ...
-
Excel VBA comboboxへの割り当て
-
実行時エラー3001「引数が間違...
-
実行時エラー48発生時のDLL特定...
-
【マクロ】エラー【#DIV/0!】が...
-
マクロについて教えてください...
-
実行時エラー -'-2147417848
-
なぜエラーになるのでしょうか...
-
VBAでのエラー
-
ExcelVBA Range クラスの Page...
-
VBAのグラフの設定について
-
VBAの実行時エラー91!どうしよ...
-
AccessVBAでExcelを起動し、罫...
-
Invalid procedure call or arg...
-
VBAで入力規則の設定がうまくい...
-
VBS実行時エラー オブジェクト...
-
OLEDB.NETで接続できない
-
Access:結果は出るがエラー
-
EXCEL VBAマクロ中断でデバッグ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
VBAがブレークモードになっ...
-
【マクロ】エラー【#DIV/0!】が...
-
なぜこんな初歩的なVBAのIf文で...
-
VBAでのエラー
-
実行時エラー -'-2147417848
-
実行時エラー48発生時のDLL特定...
-
マクロについて教えてください...
-
ExcelVBA Range クラスの Page...
-
EXCEL VBAマクロ中断でデバッグ...
-
実行時エラー3001「引数が間違...
-
EXCEL/VBAで、自分のPCだけエラ...
-
VB6+SQL サーバー 2000 で 実行...
-
VBAのエラー発生場所をメッセー...
-
ADODB.Streamを使用してUTF-8を...
-
【Excel VBA】マクロをボタンに...
-
OLEDB.NETで接続できない
-
なぜエラーになるのでしょうか...
-
INSERT INTOステートメント構文...
-
Outlook.ApplicationをCreateOb...
おすすめ情報