2016-04-27 12 views
0

Excel 2016(win10)でSQLite ODBC Driver v0.9993を使用しています。外部ソースを使用する主な原動力は、Excel用のデータがあまりにも多くあるため、ユーザーが選択した基準に基づいて取得されます。このため、私は、明確に定義されたワークシート・セルの内容に基づいて、パラメータ化された問合せを使用したいと考えています。SQLiteでExcelでパラメータ化されたクエリ

私は二つの方法しようとしている

:私はこのような何か(ラフコード)を行うストレートVBA、

  1. を:

    Sub UpdateTables() 
        Dim ws as Worksheet 
        Dim adoCN As ADODB.Connection 
        Dim adoCmd As ADODB.Command 
        Dim adoRS As ADODB.Recordset 
        Dim sDB as String 
        Dim rCell as Range 
        Set adoCN = New ADODB.Connection 
        Set adoRS = New ADODB.Recordset 
        ' ws is set to correct worksheet 
        ' ... 
        ' define sDB from worksheet cell 
        With adoCN 
         .Open "Provider=MSDASQL.1;Persist Security Info=True;" _ 
          & "Driver={SQLite3 ODBC Driver};" _ 
          & "Database=" & sDB & ";" _ 
          & "DSN=SQLite3 Datasource;LongNames=true;fksupport=true", "", "" ' 
        End With 
        Set adoCmd = New ADODB.Command 
        adoCmd.ActiveConnection = adoCN 
        ' rCell points to cell containing query parameter 
        Set adoParam = adoCmd.CreateParameter(, adVarChar, adParamInput, _ 
         Len(rCell.value), rCell.value) 
        adoCmd.Parameters.Append adoParam 
        adoCmd.CommandText = "SELECT * FROM TableName WHERE X = ?" 
        adoRS.Open Source:=adoCmd, CursorType:=adOpenKeyset 
        With ws.ListObjects(1).QueryTable 
         Set .RecordSet = adoRS 
         .Refresh ' errors with "Error 1004: invalid accessor flag" 
        End With 
    End Sub 
    

    (コードは、私は健全性チェックが含まれ、一般的に、簡素化されました。

  2. GUIベースのExcelで、と新しいクエリ>他のソースから>ODBCから、DSNを "SQLite3 Datasource"に設定し、上記の接続文字列に入力します。

    残念ながら、 "パラメータ" ボタン(接続>選択クエリ>プロパティ>定義タブ)がグレー表示されます。

私は第2の解決策を好むと思いますが、どちらも現時点では機能していません。

+0

。Value2'?それはうまくいくはずです。なぜ、最初のものが動作していないと言いますか?それはどういう意味ですか? – Ralph

+0

これは主にパラメータ化ではないためです。ユーザーがセル '5; DROP TABLE users;を入力することはありそうにないと思うが、私はそれがより速く、より長期的に持続可能であるとも信じている。 – r2evans

+0

私は、最初のメソッドが "Error 1004:invalid accessor flag"でエラーを起こしているため動作していないと言います。これは救済策の明確な兆候がない曖昧なエラーです。 – r2evans

答えて

0

opening recordsetでは、ADO接続ではなく、ADO commandオブジェクトからコマンドを実行する必要があります。これは多くの場合、レコードセットの.execute vs .openのトピックです。もちろん、エラー処理を追加して、関連するエラー/例外をキャプチャしてください。あなたが最初のメソッドを使用して `adoCmd.CommandText =&ワークシート(1).Range( "RangeForParameter") "テーブル名X = SELECT * FROM" にコマンドを変更しないのはなぜ

Sub UpdateTables() 
On Error GoTo ErrHandle 
    Dim ws as Worksheet 
    Dim adoCN As New ADODB.Connection, adoRS As New ADODB.Recordset 
    Dim adoCmd As New ADODB.Command  
    Dim sDB as String 
    Dim rCell as Range 

    'Set ws = ... ' 
    'sDB = ... ' 

    ' DATABASE CONNECTION ' 
    adoCN.Open "Provider=MSDASQL.1;Persist Security Info=True;" _ 
        & "Driver={SQLite3 ODBC Driver};" _ 
        & "Database=" & sDB & ";" _ 
        & "DSN=SQLite3 Datasource;LongNames=true;fksupport=true", "", "" 

    ' ADO COMMAND ' 
    With adoCmd 
     .ActiveConnection = adoCN 
     .CommandText = "SELECT * FROM TableName WHERE X = ?" 
     .CommandType = adCmdText 
     .Parameters.Append .CreateParameter(, adVarChar, adParamInput, _ 
              Len(rCell.value), rCell.value) 
    End With 

    ' EXECUTE RECORDSET ' 
    Set adoRS = adoCmd.Execute 

    ' DEFINE QUERYTABLE ' 
    With ws.ListObjects(1).QueryTable 
     Set .RecordSet = adoRS 
     .Refresh 
    End With 

    ' CLOSE AND FREE RESOURCES ' 
    adoRS.Close: adoCN.Close 
    Set adoRS = Nothing: Set adoCmd = Nothing: Set adoCN = Nothing  
    Exit Sub 

ErrHandle: 
    MsgBox Err.Number & " - " & Err.Description 
    Set adoRS = Nothing: Set adCmd = Nothing: Set adCN = Nothing  
    Exit Sub  
End Sub 
+0

ある時点で、 'adOpenStatic'(' Recordset.Open'用)への切り替えが解決されていて、 '.Execute'でそのオプションを指定する方法を理解できませんでした。私は助けてくれてありがとう! – r2evans

+0

確かに。ちょうどMySQL接続でテストされています。また、データソース(つまりファイル)とオプション(ODBC/DSNをodbcad32.exeでチェックすることができます)を持つ3つのうちの1つである必要がある場合は、プロバイダ、ドライバ、およびDSNを一緒に持っていることを確認してください。 – Parfait

+0

私はそれも考えていましたが、トラブルシューティング中(多くのことが起こっています)、内部で使用していた接続文字列を取得しました。おそらく、私はそれを働かせて、それを減らすことが優先事項になりました。 – r2evans

関連する問題