2016-05-03 21 views
8

Sto generando script di database sql utilizzando il codice C#.ScriptingOptions sql smo non supporta i dati di scripting

il seguente codice funziona correttamente per create table ma quando provo a utilizzare scriptOptions.ScriptData = true; viene generata in seguito all'eccezione.

un'eccezione non gestita di tipo 'Microsoft.SqlServer.Management.Smo.FailedOperationException' verificato in Microsoft.SqlServer.Smo.dll

Ulteriori informazioni: Questo metodo non supporta i dati di scripting.

codice

public static string ScriptDatabase(string dbConnectionString, string databaseName) 
     { 

      SqlConnection conn = new SqlConnection(dbConnectionString); 
      ServerConnection serverConn = new ServerConnection(conn); 
      var server = new Server(serverConn); 
      var database = server.Databases[databaseName]; 

      var scripter = new Scripter(server); 
      // I tried this code also  
      // scripter.Options.ScriptData = true; 
      ScriptingOptions scriptOptions = new ScriptingOptions(); 
      scriptOptions.ScriptDrops = false; 
      scriptOptions.ScriptData = true; 
      scriptOptions.ScriptSchema = true; 


      scriptOptions.IncludeIfNotExists = true; 
      string scrs = ""; 
      string tbScr = ""; 
      foreach (Table myTable in database.Tables) 
      { 
       /* Generating IF EXISTS and DROP command for tables */ 
       StringCollection tableScripts = myTable.Script(scriptOptions); 
       foreach (string script in tableScripts) 
        scrs += script + "\n\n"; 

       /* Generating CREATE TABLE command */ 
       tableScripts = myTable.Script(); 
       foreach (string script in tableScripts) 
        tbScr += script + "\n\n"; 
      } 
return (scrs + "\n\n" + tbScr); 
} 
+1

Provare 'Scripter.EnumScript (database.Tables)' piuttosto che 'Table.Script()' su ogni singola tabella. (Disclaimer: non testato.) –

+0

@JeroenMostert non funziona per me potrebbe essere che sto usando male, puoi aiutarmi nel mio codice .. grazie – Neo

risposta

9

Le seguenti opere sulla mia macchina (Win 7.0, .NET 4.0, VS 2010) ho creato un semplice Win forma app con il tasto OK e chiama la funzione di seguito.
Nota: ho inizialmente aggiunto se (myTable.IsSystemObject == true) continua; per garantire che le viste di sistema non vengano programmate; Non ho ancora testato se questo è effettivamente necessario:

public static string ScriptDatabase(string dbConnectionString, string databaseName) 
    { 

     SqlConnection conn = new SqlConnection(dbConnectionString); 
     ServerConnection serverConn = new ServerConnection(conn); 
     var server = new Server(serverConn); 
     var database = server.Databases[ databaseName ]; 

     var scripter = new Scripter(server); 
     scripter.Options.IncludeIfNotExists = true; 
     scripter.Options.ScriptSchema = true; 
     scripter.Options.ScriptData = true; 


     string scrs = ""; 
     string tbScr = ""; //no longer needed 
     foreach(Table myTable in database.Tables) 
     { 
      if(myTable.IsSystemObject == true) continue; 

      foreach(string s in scripter.EnumScript(new Urn[] { myTable.Urn })) 
       scrs += s + "\n\n"; ; 
     } 
     return (scrs + "\n\n" + tbScr); 
    } 

uscita:

SET ANSI_NULLS ON 

SET QUOTED_IDENTIFIER ON 

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tBlah]') AND type in (N'U')) 
BEGIN 
CREATE TABLE [dbo].[tBlah](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [tID] [varchar](20) COLLATE Latin1_General_CI_AS NULL, 
    [Value] [varchar](20) COLLATE Latin1_General_CI_AS NULL 
) ON [PRIMARY] 
END 

SET IDENTITY_INSERT [dbo].[tBlah] ON 


INSERT [dbo].[tBlah] ([ID], [tID], [Value]) VALUES (1, N'2', N'1234') 

INSERT [dbo].[tBlah] ([ID], [tID], [Value]) VALUES (2, N'2', N'345.6') 

MSDN Riferimenti:

+1

@Kiquenet - Non sembra che ci sia un modo: https: // StackOverflow .com/questions/35358122/using-smo-to-script-partial-data-content-only-rows-matching-a-where-clause – Alex

+0

'Assiemi e spazi dei nomi? Microsoft.SqlServer.Smo? ' – Kiquenet

Problemi correlati