ScriptingOptions sql smo不支持脚本数据

Neo*_*Neo 10 c# sql sql-server sql-server-2008

我正在使用c#代码生成sql数据库脚本.

下面的代码工作正常,create table但当我尝试使用scriptOptions.ScriptData = true;它时抛出以下异常.

Microsoft.SqlServer.Smo.dll中发生未处理的"Microsoft.SqlServer.Management.Smo.FailedOperationException"类型的异常异常

附加信息:此方法不支持脚本数据.

码

 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);
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 15

以下适用于我的机器(Win 7.0,.NET 4.0,VS 2010)我使用OK按钮创建了一个简单的Win表单应用程序并在下面调用了函数.
注意:我最初添加if(myTable.IsSystemObject == true)继续; 确保系统视图没有编写脚本; 我还没有测试过这是否真的需要:

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 );
    }
Run Code Online (Sandbox Code Playgroud)

输出:

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')
Run Code Online (Sandbox Code Playgroud)

MSDN参考文献: