Frage

I SQL-Skripte ausführen, um das Datenbankschema zu ändern. Es sieht etwa so aus:

using (var command = connection.CreateCommand())
{
    command.CommandText = script;
    command.ExecuteNonQuery();
}

Darüber hinaus werden die Befehle innerhalb einer Transaktion ausgeführt wird.

Die Scrip sieht wie folgt aus:

Alter Table [TableName]
ADD [NewColumn] bigint NULL

Update [TableName]
SET [NewColumn] = (SELECT somevalue FROM anothertable)

Ich erhalte eine Fehlermeldung, weil NewColumn existiert nicht. Es scheint, es zu analysieren und zu validieren, bevor sie ausgeführt wird.

Wenn ich das ganze Zeug im Management Studio ausführen, ich GO zwischen den Aussagen setzen, dann funktioniert es. Wenn ich GO in das Skript setzen, klagt ADO.NET (falsche Syntax in der Nähe von 'GO').

Ich konnte das Skript in separate Skripte aufgeteilt und in separaten Befehle ausführen, wäre dies nur schwer zu handhaben. Ich konnte es auf jeder GO aufgeteilt, Parsen das Skript selbst. Ich denke nur, dass es eine bessere Lösung sein und dass ich etwas nicht verstanden habe. Wie soll Skripte wie folgt ausgeführt werden?


Meine Implementierung, wenn jemand interessiert ist, nach John Saunders' Antwort:

List<string> lines = new List<string>();
while (!textStreamReader.EndOfStream)
{
    string line = textStreamReader.ReadLine();
    if (line.Trim().ToLower() == "go" || textStreamReader.EndOfStream)
    {
        ExecuteCommand(
            string.Join(Environment.NewLine, lines.ToArray()));

        lines.Clear();
    }
    else
    {
        lines.Add(line);
    }
}
War es hilfreich?

Lösung

Sie müssen jede Partie separat ausgeführt werden. Insbesondere ein Skript auszuführen, die mehrere Chargen ( „GO“ keywords) enthalten, haben Sie das Skript auf den „GO“ keywords aufzuspalten.

Nicht getestet:

string script = File.ReadAllText("script.sql");
string[] batches = script.Split(new [] {"GO"+Environment.NewLine}, StringSplitOptions.None);
foreach (string batch in batches)
{
    // run ExecuteNonQuery on the batch
}

Andere Tipps

mit Nicht einer von zig ORM Bibliotheken, es zu tun? Gut: -)

Um absolut sicher zu sein, wenn das Ausführen von Skripts, die tun strukturelle Veränderungen SMO verwenden, anstatt SqlClient und stellen Sie sicher, MARS wird auf über Verbindungszeichenfolge nicht eingeschaltet (SMO normalerweise beschweren, wenn es sowieso). Geben Sie für Serverconnection Klasse und ExecuteNonQuery - verschiedene DLL natürlich: -)

Das diff ist, dass SMO dll das Skript pases zu SQL, wie sie ist, so ist es echt Äquivalent es in SSMS oder über isql cmd Zeile ausgeführt wird. Slicing auf GO-s endet in viel größeren Scan wächst jedes Mal, wenn Sie eine andere Panne auftreten (wie das GO in der Mitte eines mehrzeiligen Kommentar sein kann, gibt mehrere USE-Anweisungen sein kann, kann ein Skript, um die sehr DB fallen lassen, dass SQLClient verbunden - oops :-). I I (nach komplexere Skripte in Konflikt mit MARS und MARS ist gut für die Produktion Code aber nicht für die Admin-Sachen) geerbt nur eine solche Sache in der Code-Basis getötet.

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