2012-12-04 49 views
3

我正在使用ADODB连接编写SQL语句以便在excel vba中提取数据。如何使用adodb编写sql查询来选择长度超过255个字符的数据

我的问题是,我有一个单元格它包含一个字符串超过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 & "'") 

我的工作表被称为数据库,它有诸如等级和ITEM_NO列。

列公式之下的单元格之一具有超过255个字符的字符串。

请指教。

UPDATE

我想强调的是

a)其是萃取的是超过255个字符的限制各个场数据。意思就是说,在*的“SELECT * FROM”

二)它是超过255个字符

C未我的输入参数)这不是我的查询字符串超过255个字符

+0

尝试使用'ADODB.Command'和数据绑定('Command.Parameters.Append Command.CreateParameter(text_index ,enum_type,enum_direction,大小,值)')。 – Passerby

+0

你能给我一个更清晰的图片和答案吗?谢谢。 –

回答

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表格的测试,但我曾经在Oracle的Classic-ASP中使用过这种方法几个月,所以它应该适用于你的一些调整。

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

+0

我会在有空的时候尝试这种方法。可能需要一段时间才能回到这个。 –

+0

@ kimsia好吧,你以后的编辑澄清了这个问题。那么这种方法可能无法解决你的问题,因为我以前认为这是你的SQL语句超出了限制。 – Passerby

1

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

一个简单的解决方法可能是确保工作表上的第一个数据行始终包含长度超过255个字符的值 - 要么是稍后放弃的虚拟行,要么是确保结束于该行的实际数据值。

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

相关问题