如何使用adodb编写sql查询来选择长度超过255个字符的数据

时间:2012-12-04 02:57:04

标签: sql excel vba excel-vba adodb

我正在使用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等列。

列Formula下的一个单元格的字符串长度超过255个字符。

请告知。

更新

我想强调一下

a)提取的单个字段数据超过255个字符限制。意思是说,“SELECT * FROM”中的*

b)不是我的输入参数超过255个字符

c)不是我的查询字符串超过255个字符

2 个答案:

答案 0 :(得分:1)

当您使用Excel 2003及更早版本的连接字符串时,此Microsoft support article适用。如果数据的前8行中没有超过255个字符的值,则所有值都将被截断为255个字符。

一个简单的解决方法可能是确保工作表上的第一个数据行始终包含一个长度超过255个字符的值 - 您稍后丢弃的虚拟行或您确保在该行中结束的实际数据值。 / p>

您可以将扫描的行数调整为16,但这并不能解决问题

答案 1 :(得分: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...

你可以check MSDN for detailed information about CreateParameter and its parameters

没有使用Excel表进行测试,但我曾经在Classic-ASP for Oracle中使用过这个方法几个月,所以它应该适合你一些调整。

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