当前位置: 首页 > 面试题库 >

ScriptingOptions sql smo不支持脚本数据

林泰平
2023-03-14
问题内容

我正在使用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);
}

问题答案:

对以下内容进行了测试:

  • Win 7.0,.NET 4.0,VS 2010,SQL Server 2008R2
  • Win 7.0,.NET 4.6.1,VS 2017,SQL Server 2014

所需的程序集引用:

  • Microsoft.SqlServer.ConnectionInfo
  • Microsoft.SqlServer.Management.Sdk.Sfc
  • Microsoft.SqlServer.Smo

我使用“确定”按钮创建了一个简单的Win Forms应用程序,并调用了以下功能。

注意:如果要脚本化视图,则需要添加

if( myView.IsSystemObject == true ) continue;

确保未编写系统视图的脚本;我还没有测试。对于旧版本的SQL Server,您可能还需要检查表。

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 = "";
    foreach( Table myTable in database.Tables )
    {
        foreach( string s in scripter.EnumScript( new Urn[] { myTable.Urn } ) )
            scrs += s + "\n\n"; ;
    }
    return ( scrs );
}

函数将如下调用:

// Connection string for local SQL Server default instance
ScriptDatabase( "Server=.;Database=PlayGround;Trusted_Connection=True;", "PlayGround" );

输出:

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参考:

  • Microsoft.SqlServer.Management.Smo.Scripter
  • Microsoft.SqlServer.Management.Common.ServerConnection
  • Microsoft.SqlServer.Management.Smo.Server
  • Microsoft.SqlServer.Management.Smo.Database

2019年12月17日更新: 检查最新的.NET版本; 添加了必需的参考;清理示例代码;添加了示例conn字符串



 类似资料:
  • Ruby 与 Git grit jgit + jruby PHP 与 Git Python 与 Git pygit Perl 与 Git perlgit 译者注: 此章的英文版原文也只是列出了大纲, 因此中文版看出起就很单薄, 以后我们尽量完善:)

  • 问题内容: 根据[这一线索]从旧的谷歌集团,AppsScript是基于ECMA-262第3版。 编辑器中的自动完成功能会显示3rd Edition数组函数,这似乎可以证明这一点。 但是,以下代码运行得非常好,对此产生了疑问: 请注意针对每个使用ECMA-262第5版阵列功能。 有人会就这种情况给出权威性的答案吗?依靠所有第5版功能或已实施且似乎有效的子集是否安全? 问题答案: GoogleApps

  • 我试图编译GLSL着色器在LWJGL使用OpenGL。我在MacOS Sierra上。 尝试编译着色器时出现以下错误: 着色器代码在Windows上工作,但在macOS上测试时却不能。下面是着色器代码: 下面是我如何加载着色器。。。 print语句返回正确的输出,但它仍然给我错误。 我在stackoverflow上下搜索了一个解决方案,但每个人都说他们在编译它时没有换行符,我有。我不明白为什么会这

  • 我使用的是IntelliJ IDEA Ultimate 2019.3.1。每当我尝试启动任何简单的Java Maven项目(甚至可能是一个简单的Hello World)时,我都会得到以下错误: 通过终端运行,得到以下输出: 通过终端运行,得到以下输出:

  • 我刚刚安装了3.0使用在我的笔记本电脑上,这是运行14.04: 然而,当我使用时,终端似乎认为它使用的是1.2版。1: 更糟糕的是,当我去打开一个JSON nbform版本4的笔记本,它支持IPython3.0,我得到以下错误: 我试图使用团队推荐的命令将笔记本降级到版本3,但对我来说也失败了: 这到底是怎么回事?

  • 我目前在按钮按钮上用于“显示当天报价”的脚本缺少一个功能:链接支持= 仅仅添加一个普通的“href”不起作用,它只显示为文本。 还有别的办法吗?