我正在使用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个字符
答案 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对象)用于等待绑定数据。