[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2004/09/14(Tue) 11:15
投稿者名:ももたろう
Eメール:
URL :
タイトル:
mdb検索方法
下記コードでmdbを検索するプログラムを作りました。
問題なく検索できますが、ネットで見るとスリムな書き方をしているのを見ることがあります。
ADOにこだわらないので、アドバイス頂きたいです。
よろしくお願いします。

Private Function search(file As String, Pin As String, Symbol As String, i As Long, row1 As Integer)
    Dim cn          As New ADODB.Connection  'コネクションオブジェクト
    Dim rs          As ADODB.Recordset
    Dim strSQL      As String
    Dim cmd         As ADODB.Command
    Dim para1       As ADODB.Parameter
    Dim para2       As ADODB.Parameter
    Dim para3       As ADODB.Parameter
    Dim sFlagmdb    As String   'mdbに存在するかのフラグ

    Set cn = New ADODB.Connection
    '接続元のプロバイダとデータベースをConnectionStringで指定
    cn.ConnectionString = "provider=microsoft.jet.oledb.4.0;data source=" & App.Path & "\seishiki.mdb"
    'コネクションを開く
    cn.Open

    '選択クエリーを設定
    strSQL = "SELECT * FROM search where ファイル名=? and ピン数=? and シンボル名1=?"
    Debug.Print strSQL

    'Commandオブジェクトの設定
    Set cmd = New ADODB.Command
    cmd.ActiveConnection = cn
    cmd.CommandText = strSQL

    'パラメータオブジェクトの作成
    Set para1 = New ADODB.Parameter
    Set para1 = cmd.CreateParameter("a", adVarChar, adParamInput, 2)
    cmd.Parameters.Append para1
    Set para2 = New ADODB.Parameter
    Set para2 = cmd.CreateParameter("b", adVarChar, adParamInput, 5)
    cmd.Parameters.Append para2
    Set para3 = New ADODB.Parameter
    Set para3 = cmd.CreateParameter("c", adVarChar, adParamInput, 50)
    cmd.Parameters.Append para3

    '検索する値を設定
    cmd.Parameters("a").value = Left(file, 2)  'ファイル名
    cmd.Parameters("b").value = Pin 'ピン数
    cmd.Parameters("c").value = Symbol  'シンボル名1

    'Recordsetオブジェクトの作成
    Set rs = New ADODB.Recordset
    'ファイル名がmdbに存在するか?
    Set rs = cmd.Execute
    'mdb検索
    sFlagmdb = 0
    With rs
        Do While Not .EOF
            If .EOF = True Then
                sFlagmdb = 0
                Exit Do
            Else
                sFlagmdb = 1
                Debug.Print rs![ファイル名] & " " & rs![ピン数] & " " & rs![シンボル名1]
                .MoveNext
            End If
        Loop
    End With

    'Recordsetオブジェクトを閉じる
    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
End Function

投稿時間:2004/09/14(Tue) 12:01
投稿者名:nanashi
Eメール:
URL :
タイトル:
Re: mdb検索方法
私はCommandオブジェクトやParamaterオブジェクトは使ったこと無いのでよく分かりませんが、
ConnectionとRecordSetだけで充分だと思います。

strSQLにちゃんとクエリーを書いて、
rs.Open strSQL, cn, adOpenStatic, adLockReadOnly
で開けますよ。

てゆーかファイル名の有無を調べるだけならwhere条件にピン数とシンボル名を入れちゃマズイっしょf^_^;

投稿時間:2004/09/14(Tue) 12:50
投稿者名:ももたろう
Eメール:
URL :
タイトル:
Re^2: mdb検索方法
> 私はCommandオブジェクトやParamaterオブジェクトは使ったこと無いのでよく分かりませんが、
> ConnectionとRecordSetだけで充分だと思います。
>
> strSQLにちゃんとクエリーを書いて、
> rs.Open strSQL, cn, adOpenStatic, adLockReadOnly
> で開けますよ。

この方法を試したんですが、「型が一致しません」のエラーになってしまい、悩んでいるところです。
下記がそのコードです。
まだよくわかっていないので、いろいろ試しながらやっています。

  Dim rs      As Recordset
    Dim strSQL      As String
    Dim sFlagmdb    As String   'mdbに存在するかのフラグ
    Dim wrkJet As Workspace         'ワークスペースオブジェクト
    Dim dbsCONV As Database           'データベースオブジェクト
          
    'Jet Workspace オブジェクトを作成します。
    Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)
    
    'マスタMDB設定
    Set dbsCONV = wrkJet.OpenDatabase(App.Path & "\seishiki.mdb", True)
    
    strSQL = "SELECT * FROM search WHERE ファイル名 = '" & Left(file, 2) & "' and ピン数 = '" & Pin & "' and シンボル名1= '" & Symbol & "';"
    Debug.Print strSQL
    Set rs = dbsCONV.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) ***ここでエラーになる***
    
    'mdb検索
    sFlagmdb = 0
    With rs
        Do While Not .EOF
            If .EOF = True Then
                sFlagmdb = 0
                Exit Do
            Else
                sFlagmdb = 1
                Debug.Print rs![ファイル名] & " " & rs![ピン数] & " " & rs![シンボル名1]
                .MoveNext
            End If
        Loop
    End With

> てゆーかファイル名の有無を調べるだけならwhere条件にピン数とシンボル名を入れちゃマズイっしょf^_^;

説明不足ですみません。
ファイル名、ピン数、シンボル名全てが一致という条件で、検索したいので。

投稿時間:2004/09/14(Tue) 14:11
投稿者名:nanashi
Eメール:
URL :
タイトル:
Re^3: mdb検索方法
> この方法を試したんですが、「型が一致しません」のエラーになってしまい、悩んでいるところです。

DAOは使ったこと無いので分かりませんが、このrsはDAOのRecordSetオブジェクトなんでしょうか?
もし参照設定でADOとDAOの両方を指定していた場合、優先順位が上にある方が使われます。
宣言する時は

    Dim rs As DAO.Recordset

のようにする癖を付けて下さい。

ちなみに私ならADOでこんな感じ↓にしますね。
まァ、どういう風に使う関数なのか分からないので適当ですけど。


Private Function search(file As String, Pin As String, Symbol As String) As String
    Dim cn          As ADODB.Connection
    Dim rs          As ADODB.Recordset
    Dim strSQL      As String
    Dim sFlagmdb    As String
    
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    
    With cn
        .ConnectionString = "provider=microsoft.jet.oledb.4.0;data source=" & App.Path & "\seishiki.mdb"
        .Open
    End With
    
    '選択クエリーを設定
    strSQL = "select count(*) as [num] " & _
             "from search " & _
             "where([ファイル名] = '" & Left$(file, 2) & "' and " & _
                   "[ピン数] = " & Pin & " and " & _
                   "[シンボル名1] = '" & Symbol & "')"
    
    With rs
        .Open strSQL, cn, adOpenStatic, adLockReadOnly
        
        sFlagmdb = !num
        
        .Close
    End With
    
    cn.Close
    
    Set rs = Nothing
    Set cn = Nothing
    
    search = sFlagmdb
End Function

投稿時間:2004/09/14(Tue) 15:22
投稿者名:ももたろう
Eメール:
URL :
タイトル:
Re^4: mdb検索方法
できました!!ありがとうございました。(修正後のコードを下記に貼り付けておきます)

> DAOは使ったこと無いので分かりませんが、このrsはDAOのRecordSetオブジェクトなんでしょうか?
> もし参照設定でADOとDAOの両方を指定していた場合、優先順位が上にある方が使われます。
> 宣言する時は
>
>     Dim rs As DAO.Recordset
>
> のようにする癖を付けて下さい。

参照設定で、DAOも設定しており、ADOより上になっていたので、参照設定をはずしました。

> ちなみに私ならADOでこんな感じ↓にしますね。
> まァ、どういう風に使う関数なのか分からないので適当ですけど。
>
>
> Private Function search(file As String, Pin As String, Symbol As String) As String
>     Dim cn          As ADODB.Connection
>     Dim rs          As ADODB.Recordset
>     Dim strSQL      As String
>     Dim sFlagmdb    As String
>    
>     Set cn = New ADODB.Connection
>     Set rs = New ADODB.Recordset
>    
>     With cn
>         .ConnectionString = "provider=microsoft.jet.oledb.4.0;data source=" & App.Path & "\seishiki.mdb"
>         .Open
>     End With
>    
>     '選択クエリーを設定
>     strSQL = "select count(*) as [num] " & _
>              "from search " & _
>              "where([ファイル名] = '" & Left$(file, 2) & "' and " & _
>                    "[ピン数] = " & Pin & " and " & _
>                    "[シンボル名1] = '" & Symbol & "')"
>    
>     With rs
>         .Open strSQL, cn, adOpenStatic, adLockReadOnly
>        
>         sFlagmdb = !num
>        
>         .Close
>     End With
>    
>     cn.Close
>    
>     Set rs = Nothing
>     Set cn = Nothing
>    
>     search = sFlagmdb
> End Function

'***ここからが修正後のソースです***
Private Function search(file As String, Pin As String, Symbol As String, i As Long, row1 As Integer)
    Dim cn          As New ADODB.Connection  'データベースに接続するためのコネクションオブジェクト
    Dim rs          As ADODB.Recordset
    Dim strSQL      As String
    Dim sFlagmdb    As String   'mdbに存在するかのフラグ
          
    Set cn = New ADODB.Connection

    'コネクションを開く
    cn.Open ("provider=microsoft.jet.oledb.4.0;data source=" & App.Path & "\seishiki.mdb")

    Set rs = cn.Execute("SELECT * FROM search WHERE ファイル名 = '" & Left(file, 2) & "' and ピン数 = '" & Pin & "' and シンボル名1= '" & Symbol & "';")
    
    'mdb検索
    sFlagmdb = 0
    With rs
        Do While Not .EOF
            If .EOF = True Then
                sFlagmdb = 0
                Exit Do
            Else
                sFlagmdb = 1
                Debug.Print rs![ファイル名] & " " & rs![ピン数] & " " & rs![シンボル名1]
                .MoveNext
            End If
        Loop
    End With  
    
    'Recordsetオブジェクトを閉じる
    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
End Function