3

ADODB 接続を使用して SQL ステートメントを記述し、Excel vba でデータを抽出しています。

私の問題は、255 文字を超える文字列を含むセルがあることです。

255 文字を超えるデータを選択するために ADODB 接続を引き続き使用する方法があるかどうか疑問に思っています

これは私が使用した機能です。

Public Function QueryRead(sqlArg As String) As Dictionary

    Dim pConnection As ADODB.Connection
    Set pConnection = New ADODB.Connection

    With pConnection
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source=" & ActiveWorkbook.FullName & _
        ";Extended Properties=Excel 8.0;"
    '.Provider = "MSDASQL"
    '.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
    "DBQ=" & App.Path & "\ExcelSrc.xls; "
        .CursorLocation = adUseClient
        .Open
    End With

    Dim pMap As New ADODB.Recordset

    Dim sql As String
    sql = sqlArg

    Dim resultSet As New Dictionary

    pMap.Open sql, pConnection
    If pMap.RecordCount > 0 Then

        Dim record As Variant

        Dim counter As Integer
        counter = 0

        Do Until pMap.EOF

            Dim resultRecord As Dictionary

            Set resultRecord = New Dictionary

            For Each record In pMap.fields

                resultRecord.Add record.Name, record.value
            Next
            Dim index As String
            index = CStr(counter)
            resultSet.Add index, resultRecord
            counter = counter + 1
            pMap.MoveNext
        Loop

    End If

    pMap.Close
    pConnection.Close

    Set QueryRead = resultSet

End Function

これが私がそれを呼ぶ方法です

Set resultSet = model.QueryRead("SELECT * FROM [Database$] WHERE [Level] = 2 AND [Item_No] = '" & itemNo & "'")

私のワークシートは Database と呼ばれ、Level や Item_No などの列があります。

Formula 列の下のセルの 1 つに、255 文字を超える文字列があります。

お知らせ下さい。

アップデート

それを強調したい

a) 抽出された個々のフィールド データが 255 文字の制限を超えています。つまり、「SELECT * FROM」の*

b) 255 文字を超える入力パラメータではない

c) 255 文字を超えるクエリ文字列ではない

4

2 に答える 2

1

Excel 2003 以前の接続文字列を使用しているため、このMicrosoft サポート記事が適用されます。データの最初の 8 行に 255 文字を超える値がない場合、すべての値は 255 文字に切り捨てられます。

簡単な回避策として、ワークシートの最初のデータ行に必ず 255 文字を超える値 (後で破棄するダミー行、または最終的にその行に入ることを確認した実際のデータ値) が含まれるようにすることが考えられます。

スキャンする行数を最大 16 まで調整できますが、実際には問題は解決しません。

于 2012-12-04T23:30:34.793 に答える
0

ADODB.Commandこれを克服し、予期しない SQL インジェクションを回避するために、データ バインディングを使用することをお勧めします。

これを使用するには関数を変更する必要があるため、デモのような例のみを示しています。

Dim cmd AS ADODB.Command
Set cmd = New ADODB.Command
cmd.AcitveConnection = pConnection
cmd.Prepared = True
cmd.CommandText = "SELECT * FROM [Database$] WHERE [Level]=2 AND [Item_No]=?"
cmd.Parameters.Append cmd.CreateParameter("item_no",adVarChar,adParamInput,512,itemNo)

Dim pMap as ADODB.Recordset
Set pMap = New ADODB.RecordSet

pMap.open cmd
If pMap.RecordCount > 0 Then
'do stuffs...

およびそのパラメーターの詳細については、MSDN を確認してください。CreateParameter

Excel テーブルではテストされていませんが、この方法を Classic-ASP for Oracle で数か月使用したことがあるので、少し調整すればうまくいくはずです。

この方法の欠点の 1 つは、関数の引数として 1 つの SQL ステートメントを渡すことができないことです。少なくとも 2 つの引数を受け入れる必要がある場合があります。1 つは SQL ステートメント用で、もう 1 つはバインド待ちデータ用 (おそらく Dictionary オブジェクト) です。

于 2012-12-04T07:48:12.597 に答える