• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB6のADO接続)

VB6のADO接続と効率的なコードの記述方法

このQ&Aのポイント
  • VB6のADO接続方法と、レコードカウントを取得する効率的なコードの記述方法について教えてください。
  • 目的は、テーブル[Allloto6]のレコードカウントを取得し、変数[WOI(10)]に格納することです。
  • コード内のFORループの繰り返し回数が増えると処理が遅くなりますが、問題なく実行する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

いろいろ考えて、以下のようになりましたが... Public IY1 As String: Public IY2 As String: Public IY0 As String: Public I1 As Integer Public WOI(10) As Double Public DDDD As New ADODB.Connection Public RTR As New ADODB.Recordset Public Sub SY_DT_A() IY0 = "KM6" IY1 = "Allloto6" DDDD.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE =E:\U SS VB\IK NY DATA\" & IY0 & ".mdb" DDDD.Open For I1 = 1 To 10 IY2 = "SELECT Count(A) AS DataCount FROM " & IY1 & " WHERE A = " & I1 Set RTR = DDDD.Execute(IY2) WOI(I1) = RTR.Fields("DataCount").Value Next I1 RTR.Close DDDD.Close

ryu8472
質問者

お礼

 御教授頂いた事を参考にして、自分なりにサンプルを幾つか作って勉強してみようと思います。 また分からない時は、御付き合い頂ければ幸いです。  詳細な御教授を有難う御座いました。

ryu8472
質問者

補足

 今晩は。  何度も詳細説明を有難う御座います。  さて、 失礼ですが、NO5 では [ FOR ]で2回繰り返しは「応答なし」、 代わりに、NO1 NO4 で、アタリでした。下記コードです。 30まで繰り返しで、所要時間約5分でした。 IY0 = "KM6" IY1 = "Allloto6" DDDD.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE =E:\U SS VB\IK NY DATA\" & IY0 & ".mdb" DDDD.Open For I1 = 1 To 30 IY2 = "SELECT Count(A) AS DataCount FROM " & IY1 & " WHERE A = " & I1 RTR.Open IY2, DDDD, adOpenForwardOnly, adLockReadOnly If RTR.Fields("DataCount").Value <> 0 Then WOI(I1) = RTR.Fields("DataCount").Value End If RTR.Close Next I1 DDDD.Close

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.4

私はアホか(苦笑) まったく... No.3 は、 If RTR.Fields("DataCount").Value <> 0 Then WOI(I1) = RTR.Fields("DataCount").Value End If でした。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

No.2 の回答、間違っていました。 正しくは If RTR.DataCount <> 0 Then WOI(I1) = RTR.Fields("DataCount") End If でした。 すみません。 「補足」の方は 1、「カウント = -1」になる原因 ( できれば具体的に ) 2、所要時間は仕方が無い ( YES - NO ) 1 について http://support.microsoft.com/kb/194973/ja 2 について For ~ Next 2回ループで 約3分は時間がかかりすぎなので、なんとかしたい所ですね。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

No.1 一部間違いがあったので訂正 If RTR.DataCount <> 0 Then WOI(I1) = RTR.DataCount End If

ryu8472
質問者

補足

 今日は。御早い御回答有難う御座います。 ところで、恐れ入りますが「一部訂正」での[ RTR.DataCount ]ですと「メソッドが見つかりません」となるので、 [ RTR.RecordCount ]に変更したところ動作はしても「 WOI(1) = -1 」になります?? また、時間がかかると思い「 FOR で2回」にしましたが、それでも約3分かかります。更には[ WOI(1,2) ]が共に -1 になります。  コードは問題ないとは思われますが「参照設定」などの設定間違いなど他の原因なのでしょうか? 「カウント=-1」これは、一旦無視しても「所要時間がかかり過ぎ」は仕方が無い事なのでしょうか?  ここで恐れ入りますが、 1、「カウント = -1」になる原因 ( できれば具体的に ) 2、所要時間は仕方が無い ( YES - NO ) 上記2点を御教え願えませんか? PS; データ接続は「Dataコントロール」しか使った事が無く他の方法が未知の状態です。 又、pcは自作で CPU;2600K メモリ;8GB なので、所要時間は遅くはならないかと思われます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

For ~ Next を以下のように変更 DDDD.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE =E:\U SS VB\IK NY DATA\" & IY0 & ".mdb" DDDD.Open For I1 = 1 To 10 IY2 = "SELECT Count(A) AS DataCount FROM " & IY1 & " WHERE A = " & I1 RTR.Open IY2, DDDD, adOpenForwardOnly, adLockReadOnly If RTR.DataCount <> 0 Then WOI(I1) = RTR.RecordCount End If RTR.Close Next I1 DDDD.Close

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ADO1とADO2は意味は同じですか?

    Private Sub ADO1() Dim cn As New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub Private Sub ADO2() Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub は、 Dim cn As ADODB.Connection Set cn = New ADODB.Connection を簡素化したものが Dim cn As New ADODB.Connection になるのでしょうか?

  • vb ado → vb2005 ado.net変換

    お世話になります。初めて投稿させていただきます。 VB6.0で下記のようなコードでコンボボックスcboMakerへフィールド値を格納しているのですがこのコードをVB2005のado.netで記述したいのですが可能でしょうか?可能であればどのようなコードを書けばよいのでしょうか。フィールドの値を1レコードづつ取得することは可能なのでしょうか? 初心者ですみません。宜しくお願いします。 Dim con As ADODB.Connection Dim rec As ADODB.Recordset Dim sql As String Dim recCnt As Long con = New ADODB.Connection con.ConnectionString "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & パス con.Open() rec = New ADODB.Recordset sql = "SELECT * FROM " & テーブル名 rec.Open(sql, con, adOpenStatic, adLockReadOnly) If rec.RecordCount < 1 Then 'レコードが存在しない MsgBox("未登録です。", G_MB_CAUTION, G_SYSTEM_NAME) Exit Function Else ReDim CboMakerId(rec.RecordCount) End If 'コンボボックスに値を挿入 ※「.List(recCnt)」から値を挿入する With Me.cboMaker .Clear() recCnt = 0 .List(recCnt) = "" .ItemData(recCnt) = 0 Do Until rec.EOF recCnt = recCnt + 1 .List(recCnt) = rec("Name") .ItemData(recCnt) = rec("ID") rec.MoveNext() Loop End With Me.cboMaker.ListIndex = 0 rec.Close() : rec = Nothing con.Close() : rec = Nothing End Function

  • adoのループについて カレントレコードについて

    adoのFor i = 1 To rs.RecordCountについて質問があります。 Sub test() Dim i As Long Dim MyFileName As String Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset MyFileName = CurrentProject.FullName cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & MyFileName rs.Open "Tテーブル", cn, adOpenKeyset, adLockOptimistic For i = 1 To rs.RecordCount Debug.Print rs.Fields(0).Value rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これを実行した時に、テーブルには、1,2,3・・・という値が入っていて、 イミディエイドウインドウにも1,2,3・・・と順番に取得されるのですが、 For i = 1 To rs.RecordCountを実行した時は、強制的にrs.MoveFirstされるのでしょうか? For i = 1 To rs.RecordCount rs.MoveFirst Debug.Print rs.Fields(0).Value rs.MoveNext Next これと同じ意味なのでしょうか? RecordCount プロパティ (ADO) のヘルプを見ましたが、この件に関する記述は探せませんでした。 ご回答よろしくお願いします。

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • ADO オブジェクトの渡し方

    こんにちは。ADOについてお教えください。 フォームをロード時に接続プロシージャと切断プロシージャを走らせたいと思います。 ConnectDatabaseを呼び出しは成功しますが、CloseDatabase呼び出しには失敗します。 スコープの問題で、rs、cnのオブジェクトが無い為だと思います。 ConnectDatabaseで作成されたcn、rsオブジェクトを別の関数で処理するにはどのようにコードをかけばよろしいでしょうか?宜しくお願い致します。 Private Sub Form_Load() Call ConnectDatabase Call CloseDatabase End Sub Module1 ------------------ sub ConnectDatabase() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset 処理~~~~ end sub sub CloseDatabase() rs.Close cn.Close Set rs = Nothing Set cn = Nothing end sub

  • ADOでレコードを閉じるタイミング。。Access2000/VB6/Win2K

    レコードセットを返すFuncitonプロシージャーを作ってみたのですが。。。 下のGet_Recordsの方のレコードセットをCloseすると上の方のDisp_Dataでオブ ジェクトが閉じているといって怒られます。しかし、閉じないと下の方では開きっ ぱなしになると思うのですが。。。どのように処理すればいいのでしょうか? Public P_CN As ADODB.Connection Private Sub Disp_Date()   Dim RS As ADODB.Recordset   Dim SQL AS String    Set RS = Get_Records(SQL)     With RS      If .RecordCount > 0 Then       .MoveLast: .MoveFirst       .Debug.Print !顧客_ID        End If      End With      RS.Close     Set RS = Nothing End Sub Public Function Get_Records(pSQL As String) As ADODB.Recordset   Dim RS As ADODB.Recordset     Set RS = New ADODB.Recordset      RS.Open pSQL, P_CN, adOpenKeyset, adLockOptimistic     Set Get_Records = RS '''    RS.Close '''   Set RS = Nothing End Function

  • ADOでAccessファイルに接続して、ファイルの

    ADOでAccessファイルに接続して、ファイルの更新日時を取得するには? access2003です、 Private Sub 更新日時を取得() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim MyFileName As String MyFileName = "D:\My Documents\システム.mdb" cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & MyFileName 'ここで更新日時を取得 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub この状態で、更新日時を取得するにはどうすればいいでしょう? ご教授よろしくお願いします。

  • ADO 「認証に失敗しました」

    ADOでデータベースに接続したいのですが ”実行時エラー -2147217843(80040e4d) 認証に失敗しました。” になります。 コードは Sub ado() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source" & CurrentProject.FullName ★ rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub です。 ★ 印の所でエラーになります。 宜しくお願いいたします。

  • EXCEL→Access ADO接続

    お世話になります 現在ADOにてEXCEL側からAccessDBにアクセスし 値を取得しているのですが 現在下方向に貼り付けしているのですが 横方向に貼り付けさせる方法はありますか? 下記参考(現状VBAです) 現状:日付で絞込みをしています 日付け絞込みをしてヒットしたものに対して下方向に貼り付けています それを横方向に貼り付けさせたいのです Private Sub CommandButton1_Click() Dim myConn As ADODB.Connection Dim myRs As ADODB.Recordset Dim mySQL As String Dim myConstr As String Dim myDBFName As String Dim myPswd As String Dim tableName As String Dim orderDate As String Dim shipDate As String orderDate = Format(DateValue(DTPicker1.Value), "mm/dd/yyyy") shipDate = Format(DateValue(DTPicker2.Value), "mm/dd/yyyy") myDBFName = "Accessパス" myPswd = "" myConstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _ & myDBFName & ";Jet OLEDB:Database Password=" & myPswd & ";" mySQL =SQL文 Set myConn = New ADODB.Connection myConn.Open myConstr Set myRs = New ADODB.Recordset myRs.Open mySQL, myConn Worksheets("シート名").Range("開始セル名").CopyFromRecordset myRs myRs.Close Set myRs = Nothing myConn.Close Set myConn = Nothing Unload Me End Sub わかる方ご教授願います

  • VBSでADOを使ってaccessのテーブルに接続

    VBSでADOを使ってaccessのテーブルに接続する方法は? Sub ADO_test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & "D:\【Access】サンプル.mdb" rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic MsgBox "test成功です" rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub をACCESSVBAで実行すると成功しますが 全く同じコードをメモ帳に貼り付けてtest.vbsで保存し、ダブルクリックすると、 行:3 文字:11 エラー:ステートメントの末尾が不正です。 コード:800A0401 のエラーになります。 VBAは少しわかるのですが、VBSに関しては初心者です。 どこを修正すればコードが通るのか教えてください。