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も見ています
-
準・究極の選択
「年収1000万円で一生カレーライス」か 「年収180万円で毎日何でも食べ放題」 あなたはどちらを選びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
実行時エラー 3265「要求された名前、または序数
Visual Basic(VBA)
-
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
VB6 配列を初期化したい
Visual Basic(VBA)
-
-
4
ADOのCursorLocationプロパティ
Visual Basic(VBA)
-
5
VBAでアクセスDBからデータの取得について
Visual Basic(VBA)
-
6
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
7
アクセス 実行時エラー3265
その他(プログラミング・Web制作)
-
8
実行時エラー -2147217900 ADODBでレコードセットオープン時エラー
Access(アクセス)
-
9
VBの処理結果をEXCELシートへ出力したい
Visual Basic(VBA)
-
10
VBでストアドの戻りパラメータを受け取る方法
Visual Basic(VBA)
-
11
コントロールを移動できない
Visual Basic(VBA)
-
12
ODBC経由の処理が遅い
SQL Server
-
13
vba セルに入力した時間をマクロで受け取るには?
Excel(エクセル)
-
14
VB6でユーザー定義型がNothingかどうか調べるには?
Visual Basic(VBA)
-
15
access vbaにてテンポラリーテーブルが作りたいです。
Access(アクセス)
-
16
XCOPYでネットワーク越しにコピーすると、「無効なドライブ指定です」と表示される
その他(プログラミング・Web制作)
-
17
他のモジュールのプロシージャの呼び出したい。
Visual Basic(VBA)
-
18
DBの定義のサイズを大きくし過ぎると問題ある?
その他(データベース)
-
19
SQLserver算術オーバーフローエラーについて
SQL Server
-
20
VB6.0のメモリリークについて
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
VBAがブレークモードになっ...
-
エクセルエラー13型が一致しま...
-
ExcelVBA Range クラスの Page...
-
なぜこんな初歩的なVBAのIf文で...
-
VBS実行時エラー オブジェクト...
-
VBAでのエラー
-
VBSで変数の宣言はできないので...
-
マクロについて教えてください...
-
VBで構造体を使うさ際の64k...
-
VB6+SQL サーバー 2000 で 実行...
-
実行時エラー48発生時のDLL特定...
-
エクセルVBA autofilterでエラー
-
ExcelVBAで、ユーザー定義型は...
-
実行時エラー3001「引数が間違...
-
※初心者です マクロVBAについて
-
テキストボックスに記述した数...
-
ADODB.Streamを使用してUTF-8を...
-
【エクセル】ハイパーリンク先...
-
クラシックASPでのエラー処理に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
VBAがブレークモードになっ...
-
なぜこんな初歩的なVBAのIf文で...
-
【Excel VBA】マクロをボタンに...
-
VBSで変数の宣言はできないので...
-
VBS実行時エラー オブジェクト...
-
実行時エラー3001「引数が間違...
-
ExcelVBA Range クラスの Page...
-
ExcelVBAで、ユーザー定義型は...
-
EXCEL VBAマクロ中断でデバッグ...
-
マクロについて教えてください...
-
プロシージャ名の取得
-
ADODB.Streamを使用してUTF-8を...
-
実行時エラー -'-2147417848
-
Outlook.ApplicationをCreateOb...
-
VBAでのエラー
-
なぜエラーになるのでしょうか...
-
VBAのコードがエラーになっ...
-
[Delphi] データセットは閉じて...
おすすめ情報