Problemzusatz bei der Abfragetaste der Tabelle
-
18-09-2019 - |
Frage
Ich versuche, eine .xls -Tabelle mit VBScript abzufragen, aber ich bin auf ein Problem gestoßen, wenn ich versuche, ein Feld zu werfen.
Ich verbinde mich mit der Tabelle wie dieser.
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DataSource & ";Extended Properties=""Excel 8.0;HDR=No;"";"
Dann versuche ich die Tabelle abzufragen. Das Feld, an dem ich interessiert bin, enthält Dezimalwerte, kann aber auch eine * als Wildcard enthalten. Ich versuche also, das Feld in einen Varchar zu werfen, damit ich nach dem *prüfen kann.
Set objRecordset = CreateObject("ADODB.Recordset")
StrQuery = "SELECT * FROM [Sheet1$] WHERE F1 >= 2.3456 OR CAST(F1 AS VARCHAR) = '*'"
objRecordset.Open StrQuery, objConnection, adOpenDynamic, adLockOptimistic
Dies führt zu einem nicht spezifizierten Fehler 80004005. Was mache ich hier falsch?
Hinweis: Ich habe auch versucht, konvertiert zu werden, habe aber einen undefinierten Funktionsfehler erhalten.
Lösung
Sie könnten versuchen, anzuhängen IMEX=1;
zu den erweiterten Eigenschaften. Das sagt Jet DB, gemischte Zahlen, Daten und Zeichenfolgen als Text zu lesen. Dann sollten Sie in der Lage sein:
SELECT * FROM [F1$]
Das heißt, wenn F1
ist der Name des ersten Arbeitsblatts.
Andere Tipps
Ich würde die folgenden Registrierungsschlüssel auf Ihrem Server ändern (natürlich nach einer Sicherung):
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\ImportMixedTypes = Text
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows = 0
Ich würde auch Ihre Verbindungszeichenfolge an Folgendes ändern:
Dim sConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("/PathTo/YourFile/" & Filename) & ";"
If chkUploadFileColumnsFirstRow.Checked Then
sConnectionString &= "Extended Properties='Excel 8.0;HDR=YES;IMEX=1'"
Else
sConnectionString &= "Extended Properties='Excel 8.0;IMEX=1'"
End If
Wenn es nach dem Festlegen dieser Kriterien fehlschlägt, würde ich das Gefühl haben, dass etwas mit Ihrem Blattnamen oder der Abfrage selbst nicht stimmt.
Das Problem ist, dass der Microsoft Jet 4.0 -Motor die nicht unterstützt CAST()
Funktion, und es hat auch keine VARCHAR
Schlüsselwort (Nor VARCHAR
Datentyp, kommen Sie dazu). Warum müssen Sie diesen Wert geben? Müssen Sie das verarbeiten? NULL
Wert?
Apropos Datentypen:
F1 >= 2.3456
Der Wert 2.3456
ist ein wörtlicher Typ DECIMAL
Festpunkt dezimal sein. Excel hat keinen nativen festen Dezimalentyp, sodass Sie höchstwahrscheinlich einen schwimmenden Punktwert mit dem festen Punktwert vergleichen. Ich vertraue darauf, dass Sie die Probleme schätzen, die dies verursachen kann!
Ihr Prädikat
F1 >= 2.3456
schlägt vor F1
ist ein numerischer Datentyp. Bitte erläutern Sie, wie Sie einen numerischen Wert auf den Punkt bringen können VARCHAR
und erwarten zu bekommen *
als Ergebnis...? Ich kann es nicht selbst sehen!
Wenn Ihre Spalte numerische Werte enthält und *
Charaktere dann werden es gemischte Typen sein und der Jet 4.0 -Motor muss entscheiden, ob sie auswählen sollen FLOAT
(In diesem Fall werden Ihre * Zeichen durch die ersetzt NULL
Wert) oder vom Typ NVARCHAR(255)
(In diesem Fall Ihre numerischen Werte kann in wissenschaftliche Notation umgewandelt werden).
Möglicherweise können Sie Registrierungswerte verwenden, um das Ergebnis zu beeinflussen, aber keine Hoffnung, dies im SQL -Code zu tun, da der Datentyp bereits ausgewählt wurde.
Weitere Details sehen Tägliche Dosis Excel: externe Daten - gemischte Datentypen Von einem sogenannten Experten :) In den Kommentaren gibt es viele gute Details.
Ich denke, Sie müssen:
- entferne das
CAST
undVARCHAR
Schlüsselwörter aus Ihrer Abfrage (sie sind illegal); - Ändern Sie den lokalen Maschinenregistrierungsschlüssel
TypeGuessRows = 0
(Kraft zum Scannen Alle Zeilen sollten bestimmen, dass die Säule gemischte Typen ist ...); - Stellen Sie den örtlichen Maschinenregistrierungsschlüssel sicher
ImportMixedTypes = Text
(... um gemischte Typen als Text zu importieren, da es sich um den Standardwert handelt). Weitere Informationen finden Sie in früheren Antworten.
Sobald Ihre '*' Zeichen in der Spalte angezeigt werden (dh nicht mehr NULL
). Ihre Float -Werte wurden jedoch zum Text gezwungen. Sie können die Float-as-Text-Werte in die SQL zurückwerfen/zwingen, aber zuerst müssen Sie auf testen NULL
und ein numerischer Wert zB
SELECT F1,
IIF(
F1 IS NULL,
'{{Excel cell is blank}}',
IIF(
F1 = '*',
'{{Excel cell is the ''*'' character}}',
IIF(
ISNUMERIC(F1),
CDBL(F1),
'{{Excel cell is non-nmeric and not the ''*'' character}}'
)
)
) AS result
FROM [F1$];
Hinweis würde ich normalerweise bevorzugen SWITCH()
über Nest IIF()
Aber in diesem Fall muss es sein IIF()
. Grund: IIF()
Wenn für Access Database Engine SQL und beide überladen TRUE
oder der FALSE
Der Zustand wird bewertet, aber nie beides. In VBA ist das Gegenteil der Fall, dh beide Bedingungen werden immer bewertet. SWITCH()
Verknüpft weder in Access Database Engine SQL oder VBA.