【问题标题】:how to use adodb to write sql queries to select data that is longer than 255 characters如何使用adodb编写sql查询来选择长度超过255个字符的数据
【发布时间】:2012-12-04 02:57:03
【问题描述】:

我正在使用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 个字符的不是我的查询字符串

【问题讨论】:

  • 尝试使用ADODB.Command和数据绑定(Command.Parameters.Append Command.CreateParameter(text_index,enum_type,enum_direction,size,value))。
  • 你能给我一个更清晰的图片和答案吗?谢谢。

标签: sql vba excel adodb


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我建议您使用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 对象)用于等待绑定数据。

    【讨论】:

    • 有时间我会试试这个方法。不过,我可能需要一段时间才能回到这个话题。
    • @kimsia 好的,您稍后的编辑澄清了这个问题。那么这个方法可能解决不了你的问题,因为我之前以为是你的SQL语句超出了限制。
    猜你喜欢
    • 2015-09-07
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多