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.

War es hilfreich?

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:

  1. entferne das CAST und VARCHAR Schlüsselwörter aus Ihrer Abfrage (sie sind illegal);
  2. Ändern Sie den lokalen Maschinenregistrierungsschlüssel TypeGuessRows = 0 (Kraft zum Scannen Alle Zeilen sollten bestimmen, dass die Säule gemischte Typen ist ...);
  3. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top