2016-06-19 21 views
0

Ich benutze SQL Server 2012 mit SMO und C#.Erstellen Sie eine Transaktion um die generierten SQL-Einfügungen mit SQL Management Objects

Mit dieser Methode generieren ich Einfügeanweisungen aus den Daten in der Tabelle und speichern Sie diese INSERT-Anweisungen in der MySqlInsertDataStatements.sql-Datei.

Was ich jetzt tun möchte, ist wickeln alle die Einfügeanweisungen aus allen Tabellen mit einer Transaktion und Rollback-Verhalten.

Wie muss ich meinen Code ändern, dass ich diese Funktion mit Hilfe der SMO-Bibliothek tun kann.

public static void ScriptData(string filePath, Database db, Scripter scripter) 
     {   
      scripter.Options.ScriptData = true; 
      scripter.Options.ScriptSchema = false; 
      scripter.Options.WithDependencies = false; 
      scripter.Options.IncludeHeaders = false; 
      foreach (Table tbl in db.Tables.Cast<Table>().Where(t => !t.IsSystemObject)) 
      {    
       scripter.Options.FileName = filePath + @"\MySqlInsertDataStatements.sql"; 
       tbl.EnumScript(scripter.Options);    
      } 
     } 

Dies ist ein Beispiel für die Ausgabe, wie der MySqlInsertDataStatements.sql Inhalt wie folgt aussieht:

Use MyDatabase 


Insert 1 Table1 
Insert 2 Table1 

Go 


Insert 1 Table2 
Insert 2 Table2 

Go 

Antwort

0

Die Serverconnection-Referenz, die Sie haben sollten, um zu bekommen haben Zugriff auf eine Datenbank hat Methoden Begintrans, CommitTransaction und RollBackTransaction - Sie sollten in der Lage sein, diese zu verwenden, um zu erreichen, was Sie versuchen zu tun.

ist die komplette Beispiel dafür, wie sie verwendet werden können:

static void Main(string[] args) 
{ 
    var serverConnection = new ServerConnection(serverInstance: "."); 
    var server = new Server(new ServerConnection()); 
    var scripter = new Scripter(server) { Options = { ScriptData = true } }; 

    serverConnection.BeginTransaction(); 
    ScriptData(".", server.Databases["NORTHWND"], scripter); 
    serverConnection.RollBackTransaction(); 
} 

public static void ScriptData(string filePath, Database db, Scripter scripter) 
{ 
    scripter.Options.ScriptData = true; 
    scripter.Options.ScriptSchema = false; 
    scripter.Options.WithDependencies = false; 
    scripter.Options.IncludeHeaders = false; 
    foreach (Table tbl in db.Tables.Cast<Table>().Where(t => !t.IsSystemObject)) 
    { 
     scripter.Options.FileName = filePath + @"\MySqlInsertDataStatements.sql"; 
     tbl.EnumScript(scripter.Options); 
    } 
} 
+0

Sie mich falsch verstanden. Ich möchte die Erstellung des Skripts nicht in eine Transaktion einschließen. Ich möchte eine Transaktion vor meinem String erstellen Anweisungen einfügen und schließen Sie es mit der Rollback-Zeichenfolge. – Pascal

+0

Ah, Entschuldigung. Aha. Soweit ich das von den SMO-Skripting-Funktionen verstehe, ist dies im allgemeinen Fall nicht möglich, da es einige Aktionen gibt, die nicht in eine Transaktion eingeschlossen werden können (wie CREATE DATABASE). Für die Art von Aktion, die Sie hier gezeigt haben, sollte eine Transaktion in Ordnung sein - Sie könnten das Skript entweder mit einer SqlConnection mit einer Transaktion ausführen (wie in meinem ursprünglichen Code) oder .. und das hört sich zugegebenermaßen sehr hässlich an .. injizieren Sie BEGIN TRAN- und ROLLBACK TRAN-Zeilen am Anfang und am Ende der generierten .sql-Datei, nachdem der Scripter fertig ist? –