2016-04-06 7 views
0

Ich versuche, dieses Skript Arbeit zu machen (einige vba Wissen hat und keine Ahnung von vbs Unterschiede Die Lösung, die ich anzupassen versuche hier: VB Script to dump an SQL Server table to CSV und https://msdn.microsoft.com/en-us/library/ms974559.aspxVbscript. Wie csv abfragen mit ado und Rückkehr csv

es soll CSV-Datei, führen ACE SQL-Abfrage auf, es zu lesen und das Ergebnis in einem anderen CSV

es erzeugt nur eine leere output.csv Datei und es wird für die Bearbeitung gesperrt zurückkehren können Sie mir helfen.:

On Error Resume Next 

Const adOpenStatic = 3 
Const adLockOptimistic = 3 
Const adCmdText = &H0001 

Set cn = CreateObject("ADODB.Connection") 
Set rs = CreateObject("ADODB.Recordset") 

strPathtoTextFile = "C:\Databases\" 

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
      "Data Source=" & strPathtoTextFile & ";" & _ 
      "Extended Properties=""text;HDR=YES;FMT=Delimited""" 

rs.Open "SELECT * FROM PhoneList.csv", _ 
      objConnection, adOpenStatic, adLockOptimistic, adCmdText 


Set fso=CreateObject("Scripting.FileSystemObject") 
Set ts=fso.OpenTextFile("c:\Databases\output.csv",2,TRUE) 
line="" 
For Each tmp In objRecordset.Fields 
    line=line & tmp.Name & "," 
Next 

ts.WriteLine Left(line,Len(line)-1) 
While Not rs.EOF 
line="" 
For Each tmp In rs.Fields 
    If IsNull(tmp.Value) Then 
    line=line & """" & Replace(tmp.Value,"""","""""") & """," 
    Else 
    line=line & """" & tmp.Value & """," 
    End If 
Next 
ts.WriteLine Left(line,Len(line)-1) 
rs.MoveNext 
Wend 

Set rs = Nothing 
ts.close 
rs.close 
fso.close 

cn.Close 

Ich verstehe einige VBA, bin aber nicht in der Lage, meinen Weg nach draußen in diesem VBS zu finden. Kannst du mir helfen herauszufinden, was ich falsch mache?

Zweitens ... ist es möglich, alle Pfade zu Daten relativ zum Skript selbst zu machen, damit die Lösung verteilt werden kann? Ich weiß, wie man es in VBA macht, aber habe keine Ahnung, ob es mit VBScript möglich ist?

Ich bin sicher, eine solche Vorlage kann sehr hilfreich für die gesamte Gemeinschaft sein. Wenn meine Frage schlecht formuliert ist, werde ich demütig die Kritik akzeptieren.

+0

1. objRecordSet sollte wohl rs sein 2. 'strPathtoTextFile' geändert werden kann, um Eingangsweg zu relativ 3.' Set ts zu ändern = fso.OpenTextFile ("c: \ Databases \ output.csv ", 2, TRUE)' kann geändert werden, um den Ausgabepfad auf relativ zu ändern. 4. Innerhalb der Schleife können Sie 'wscript.echo Left (line, Len (line) -1)' verwenden, um das zu bestimmen Sie lesen tatsächlich Daten aus der Eingabedatei – MikeC

+0

Sie haben Recht. Ich korrigierte 1). Dennoch gibt es ein großes Problem ... es erzeugt eine Ausgabedatei, die zur Bearbeitung gesperrt und leer ist. –

+0

Entfernen Sie die "On Error Resume Next" und starten Sie erneut; Sie finden ein paar Änderungen, die vorgenommen werden müssen. "On Error Resume Next" muss vernünftig verwendet werden; Es kann den Fehler maskieren, den Sie sehen möchten. – MikeC

Antwort

0

Ich füge die Arbeitsversion des Codes hier hinzu. Es sollte hilfreich für Sie sein, die "On Error Resume Next" zu entfernen und versuchen, die Fehler zu beheben, die markiert sind. Es gibt nicht viele, sie sind nicht schwer zu reparieren, aber die Übung sollte informativ sein. Hier ist die Arbeitsversion des Code:

On Error Resume Next 

Const adOpenStatic = 3 
Const adLockOptimistic = 3 
Const adCmdText = &H0001 

Set cn = CreateObject("ADODB.Connection") 
Set rs = CreateObject("ADODB.Recordset") 

strPathtoTextFile = "C:\Databases\" 

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
      "Data Source=" & strPathtoTextFile & ";" & _ 
      "Extended Properties=""text;HDR=YES;FMT=Delimited""" 

rs.Open "SELECT * FROM PhoneList.csv", _ 
      cn, adOpenStatic, adLockOptimistic, adCmdText 


Set fso=CreateObject("Scripting.FileSystemObject") 
Set ts=fso.OpenTextFile(strPathtoTextFile & "output.csv",2,TRUE) 
line="" 
For Each tmp In rs.Fields 
    line=line & tmp.Name & "," 
Next 
ts.WriteLine Left(line,Len(line)-1) 

While Not rs.EOF 
line="" 
For Each tmp In rs.Fields 
    If IsNull(tmp.Value) Then 
    line=line & """" & Replace(tmp.Value,"""","""""") & """," 
    Else 
    line=line & """" & tmp.Value & """," 
    End If 
Next 
ts.WriteLine Left(line,Len(line)-1) 
rs.MoveNext 
Wend 

rs.close 
Set rs = Nothing 
ts.close 
cn.Close 
+0

Lieber Mike. Danke für die Hilfe. Ich habe den Code in einen Sub-in-VBA-Editor eingefügt und es stoppt in der Zeile 22 mit einem Laufzeitfehler '70' Berechtigung verweigert. Ausführen als VBS-Code stoppt in Zeile 12 behauptet, dass "Provider nicht gefunden werden kann. Es möglicherweise nicht ordnungsgemäß installiert. Code 800A0E7A Quelle: ADODB.Connection –

+0

" Berechtigung verweigert "wahrscheinlich, weil Sie an einem Speicherort schreiben Sie sollten nicht Wahrscheinlich müssen Sie den Ausgabeort ändern. Was "Provider kann nicht gefunden werden" betrifft, ist das ungewöhnlich, da die erforderlichen Dateien bereits seit langer Zeit Teil der Windows-Standardinstallation sind. Die folgende SO-Diskussion hat mehrere Vorschläge: http://stackoverflow.com/questions/2508037/vbscript-access-mdb-800a0e7a-provider-cannot-be-found-it-may-not-be-prop – MikeC