2012-03-28 5 views
0

Ich bin versucht, ein Makro zu erstellen, die in einigen Daten in Excel 2003 von SQL Server 2005.Excel VBA SQL Server-Daten importieren "type mismatch error"

Der SQL-Code ist in diesem Makro ziehen werden, und ein Teil Der Code dafür stammt von Werten in einer Zelle in Excel. Das funktioniert zu einem gewissen Grad, aber wenn die Daten in der Excel-Zelle, die ich für den SQL-Code verwende, eine Zeile in der Formelvorschau (oder ungefähr 170 Zeichen) überschreiten, erhalte ich den Fehler "Typ nicht übereinstimmen". Sonst funktioniert es richtig.

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 

Offensichtlich sind alle Datenbanknamen und Tabellennamen korrekt ausgefüllt.

Jede Idee, warum dies unten fallen wird (ob eine Zeichenbegrenzung gibt es, oder ob es scheitert, weil der Zellenwert in der Formel Vorschauleiste in Excel auf der nächsten Zeile fortgesetzt? Wie dies behoben?

Viel könnte geschätzt,

Alex

+0

32.767 Zeichen ist die Grenze für eine Excel-Zelle. Meine Vermutung ist, dass alle Ihre Daten in einer einzigen Zelle (A1) eingefügt werden. –

+0

Nicht ganz sicher, ob Sie auf den Eingang oder den Ausgang beziehen. Für die Ausgabe: Wenn die SQL-Abfrage ordnungsgemäß funktioniert Daten in verschiedenen Zellen durch, so ist dies kein Problem Für die Eingabe: Der Cut-off scheint etwa 170 Zeichen, so wieder 32.767 kein Problem. – alexei7

+0

Ich kann sehen, dass es eine Textlimit in der "Command Text" von "Edit OLE DB Query" in Excel, aber ich glaube, ich bin gut darin. – alexei7

Antwort

0

es keine Probleme durch die Excel-Zelle verursacht sein sollte mehr als 170 Zeichen haben. ich schlage vor, Aufspalten der Linie, die Fehler genau zu helfen, herauszufinden, wo das Problem ist.

ersetzen diese:

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

mit diesem:

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 druckt auf dem sofortigen Fenster, so dass Sie doppelt überprüfen, dass die Variablen halten, was man von ihnen erwarten. Ich mag | anstelle von " beim Debuggen von Strings verwenden, weil ich fast nie eine | innerhalb einer Zeichenfolge habe.

Außerdem würde ich nicht die Mühe Array() Verwendung für die CommandText oder Connection. Ich würde Ihre erste Zeile so wiederholen, dass sie zur Lesbarkeit in etwa so aussieht.

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")) 
0

Dies wird durch Entfernen des Array Text so gelöst

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

wird

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