2012-12-04 52 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個的行數,但這並不能真正解決問題

相關問題