如何使用adodb编写sql查询来select长度超过255个字符的数据
我正在使用ADODB连接写入SQL语句来提取数据在Excel VBA中。
我的问题是,我有一个单元格,其中包含超过255个字符的string。
我想知道是否有一种方法可以继续使用ADODB连接来select长度超过255个字符的数据
这是我使用的function。
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 & "'")
我的工作表被称为数据库,它有列如Level和Item_No。
列公式之下的单元格之一具有超过255个字符的string。
请指教。
UPDATE
我想强调一下
a)提取出来的个别字段数据超过255个字符限制。 意思是说,*在“SELECT * FROM”
b)我的input参数不是超过255个字符
c)它不是我的查询string超过255个字符
在使用Excel 2003和更早版本的连接string时,此Microsoft支持文章适用。 如果在数据的前8行中没有超过255个字符的值,则所有值将被截断为255个字符。
一个简单的解决方法可能是确保工作表上的第一个数据行始终包含长度超过255个字符的值 – 要么是后面放弃的虚拟行,要么是确保在该行结束的实际数据值。
您可以将扫描的行数调整到16,但这并不能真正解决问题
我build议你使用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表格进行testing,但是我曾经在Oracle的Classic-ASP中使用过这个方法几个月,所以它应该适合你一些调整。
这种方法的一个缺点是你不能只传递一个SQL语句作为函数参数。 您可能必须接受至less两个参数,一个用于SQL语句,另一个(可能是Dictionary对象)用于等待绑定的数据。