Excel VBA SQL Server Импорт данных "Ошибка несоответствия типов" - PullRequest
0 голосов
/ 28 марта 2012

Я пытаюсь создать макрос, который будет извлекать некоторые данные в Excel 2003 из SQL Server 2005.

Код SQL находится в этом макросе, и часть кода для этого происходит из значений вячейка в Excel.В некоторой степени это работает, но когда данные в ячейке Excel, которые я использую для кода SQL, превышают строку в предварительном просмотре формулы (или около 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? Как это можно исправить?

Очень ценится,

Алекс

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

Это решается удалением текста массива, поэтому

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

становится

.CommandText = ("SELECT COLUMN1, COLUMN2 FROM TABLENAME (nolock) WHERE ...
0 голосов
/ 28 марта 2012

Не должно быть никаких проблем, вызванных ячейкой 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печатает в непосредственное окно, чтобы вы могли дважды проверить, что переменные содержат то, что вы ожидаете от них.Мне нравится использовать | вместо " при отладке строк, потому что у меня почти никогда не бывает | внутри строки.

Кроме того, я бы не стал использовать Array() для CommandText илиConnection.Я бы переделал вашу первую строку, чтобы она выглядела примерно так для удобства чтения.

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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...