3

我正在使用 ADODB 连接编写 SQL 语句以在 excel vba 中提取数据。

我的问题是我有一个单元格,其中包含一个长度超过 255 个字符的字符串。

我想知道是否有办法让我继续使用 ADODB 连接来选择超过 255 个字符的数据

这是我使用的功能。

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 等列。

公式列下的单元格之一的字符串长度超过 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 中使用过这个方法几个月,所以它应该对你有用。

这种方法的一个缺点是您不能只将一条 SQL 语句作为函数参数传递。您可能必须接受至少两个参数,一个用于 SQL 语句,另一个(可能是 Dictionary 对象)用于等待绑定数据。

于 2012-12-04T07:48:12.597 回答