簡體   English   中英

Excel VBA SQL Server數據導入“類型不匹配錯誤”

[英]excel vba sql server data import “type mismatch error”

我正在嘗試創建一個宏,該宏將從SQL Server 2005將一些數據提取到Excel 2003中。

SQL代碼在此宏中,並且此代碼的​​一部分來自Excel中單元格中的值。 這在一定程度上可行,但是當我用於SQL代碼的Excel單元格中的數據超過公式預覽中的一行(或大約170個字符)時,出現“類型不匹配”錯誤。 否則它將正常工作。

With ActiveSheet.QueryTables.Add(Connection:=Array( _
"OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data       Source=anglobisql;Use Procedure for Prepare=1;Auto " _
    , _
    "Translate=True;Packet Size=4096;Workstation ID=MyIDHere;Use Encryption for Data=False;Tag with column collation when possible=F" _
    , "alse;Initial Catalog=DATABASENAME"), Destination:=Range("A1"))
    .CommandType = xlCmdSql
    .CommandText = Array("SELECT COLUMN1, COLUMN2 FROM TABLENAME (nolock) WHERE COLUMN1 IN (" & ActiveWorkbook.Sheets("Sheet1").Range("e607").Value & ")")
    .Name = "DATABASE TABLENAME"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .PreserveColumnInfo = True
    .SourceConnectionFile = _
    "H:\My Data Sources\DATABASE TABLENAME.odc"
    .Refresh BackgroundQuery:=False

顯然,所有數據庫名稱和表名稱均正確填寫。

知道為什么它會下降(是否存在字符數限制,或者是否由於單元格值繼續到Excel中的公式預覽欄中的下一行而失敗),如何解決?

非常感激,

亞歷克斯

Excel單元格超過170個字符不會引起任何問題。 我建議將出錯的行分開,以幫助找到問題所在。

替換為:

    .CommandText = Array("SELECT COLUMN1, COLUMN2 FROM TABLENAME (nolock) WHERE COLUMN1 IN (" & ActiveWorkbook.Sheets("Sheet1").Range("e607").Value & ")")

有了這個:

    Dim rng As Range, sSql As String
    Set rng = ActiveWorkbook.Sheets("Sheet1").Range("e607")
    Debug.Print "Range.Value = |" & rng.Value & "|"
    sSql = "SELECT COLUMN1, COLUMN2 FROM TABLENAME (nolock) WHERE COLUMN1 IN (" & rng.Value & ")"
    Debug.Print "SQL = |" & sSql & "|"
    .CommandText = sSql

Debug.Print打印到立即窗口,因此您可以再次檢查變量是否保存了期望的值。 我喜歡使用| 調試字符串時使用“ | "代替" ,因為我幾乎在字符串中都沒有|

另外,我不會為CommandTextConnection使用Array() 為了方便閱讀,我將重做第一行,使其看起來像這樣。

With ActiveSheet.QueryTables.Add( _
        Connection:="OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI" _
                & ";Persist Security Info=True;Data Source=anglobisql" _
                & ";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096" _
                & ";Workstation ID=MyIDHere;Use Encryption for Data=False" _
                & ";Tag with column collation when possible=False;Initial Catalog=DATABASENAME" _
      , Destination:=Range("A1"))

這是通過刪除數組文本來解決的,因此

.CommandText = Array("SELECT COLUMN1, COLUMN2 FROM TABLENAME (nolock) WHERE ...

變成

.CommandText = ("SELECT COLUMN1, COLUMN2 FROM TABLENAME (nolock) WHERE ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM