Ich bin mir sicher, dass diese Frage bereits beantwortet wurde, konnte jedoch mit dem Suchwerkzeug keine Antwort finden.
Mit c # möchte ich eine .sql-Datei ausführen. Die SQL-Datei enthält mehrere SQL-Anweisungen, von denen einige über mehrere Zeilen verteilt sind. Ich habe versucht, die Datei einzulesen und die Datei mit ODP.NET auszuführen. Ich glaube jedoch nicht, dass ExecuteNonQuery wirklich dafür ausgelegt ist.
Also habe ich versucht, sqlplus über das Laichen eines Prozesses zu verwenden. Wenn ich den Prozess jedoch nicht mit UseShellExecute erzeugt habe, das auf true gesetzt ist, würde sqlplus hängen bleiben und niemals beendet werden. Hier ist der Code, der nicht funktioniert.
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "sqlplus";
p.StartInfo.Arguments = string.Format("xx/xx@{0} @{1}", in_database, s);
p.StartInfo.CreateNoWindow = true;
bool started = p.Start();
p.WaitForExit();
WaitForExit kehrt nie zurück ... Es sei denn, ich setze UseShellExecute auf true. Ein Nebeneffekt von UseShellExecute ist, dass Sie die umgeleitete Ausgabe nicht erfassen können.
Antworten:
quelle
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup>
Ich habe diese Lösung mit Microsoft.SqlServer.Management ausprobiert, aber mit .NET 4.0 hat sie nicht gut funktioniert. Daher habe ich eine andere Lösung nur mit dem .NET libs-Framework geschrieben.
quelle
Dies funktioniert unter Framework 4.0 oder höher. Unterstützt "GO". Zeigen Sie auch die Fehlermeldung, die Zeile und den SQL-Befehl an.
quelle
connection.Close()
die Verbindung nicht benötigt wird, wird von dem geschlossen, in denusing
Sie sie eingewickelt haben.Fügen Sie den Befehl zum Ausführen des SQL-Skripts in eine Batchdatei ein und führen Sie den folgenden Code aus
Schreiben Sie in die Batch-Datei so etwas (Beispiel für SQL Server)
quelle
Das funktioniert bei mir:
quelle
Zusätzliche Verbesserungen zu surajits hinzugefügt Antwort:
Außerdem musste ich meinem Projekt folgende Verweise hinzufügen:
C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll
C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.Smo.dll
Ich habe keine Ahnung, ob dies die richtigen DLLs sind, da sich in C: \ Programme \ Microsoft SQL Server mehrere Ordner befinden, aber in meiner Anwendung funktionieren diese beiden.
quelle
Ich habe es geschafft, die Antwort durch Lesen des Handbuchs herauszufinden :)
Dieser Auszug aus dem MSDN
Verwandelt den Code in diesen;
Welches jetzt richtig beendet.
quelle
p.StandardOutput.ReadToEnd();
nie verlassenEs sind zwei Punkte zu beachten.
1) Dieser Quellcode hat bei mir funktioniert:
Ich habe das Arbeitsverzeichnis auf das Skriptverzeichnis gesetzt, damit auch Unterskripte innerhalb des Skripts funktionieren.
Nennen Sie es zB als
Execute("usr/pwd@service", "c:\myscripts", "script.sql")
2) Sie müssen Ihr SQL-Skript mit der Anweisung abschließen
EXIT;
quelle
Mit EntityFramework können Sie eine solche Lösung wählen. Ich benutze diesen Code, um e2e-Tests zu initialisieren. Um SQL-Injection-Angriffe zu verhindern, stellen Sie sicher, dass dieses Skript nicht basierend auf Benutzereingaben generiert wird, oder verwenden Sie hierfür Befehlsparameter (siehe Überladung von ExecuteSqlCommand, das Parameter akzeptiert).
quelle
Ich konnte keinen genauen und gültigen Weg finden, dies zu tun. Nach einem ganzen Tag kam ich mit diesem gemischten Code aus verschiedenen Quellen und versuchte, die Arbeit zu erledigen.
Es wird jedoch immer noch eine Ausnahme generiert
ExecuteNonQuery: CommandText property has not been Initialized
, obwohl die Skriptdatei erfolgreich ausgeführt wird. In meinem Fall wird die Datenbank erfolgreich erstellt und beim ersten Start werden Daten eingefügt.quelle