ScriptingOptions sql smo 不支持脚本数据
ScriptingOptions sql smo does not support scripting data
我正在使用 C# 代码生成 sql 数据库脚本。
以下代码适用于 create table
但当我尝试使用 scriptOptions.ScriptData = true;
时它抛出以下异常。
An unhandled exception of type
'Microsoft.SqlServer.Management.Smo.FailedOperationException' occurred
in Microsoft.SqlServer.Smo.dll
Additional information: This method does not support scripting data.
代码
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服务器 2008R2
- Win 7.0、.NET 4.6.1、VS 2017、SQL服务器 2014
所需的程序集引用:
- Microsoft.SqlServer.ConnectionInfo
- Microsoft.SqlServer.Management.Sdk.Sfc
- Microsoft.SqlServer.Smo
我创建了一个带有确定按钮的简单 Win 表单应用程序并调用了以下函数。
注意:如果编写视图脚本,您需要添加
if( myView.IsSystemObject == true ) continue;
确保系统视图不被脚本化;我没有测试过这个。对于旧版本的 SQL 服务器,您可能还需要对表进行此检查。
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 版本;添加了必需的参考资料;清理示例代码;添加示例连接字符串
我正在使用 C# 代码生成 sql 数据库脚本。
以下代码适用于 create table
但当我尝试使用 scriptOptions.ScriptData = true;
时它抛出以下异常。
An unhandled exception of type 'Microsoft.SqlServer.Management.Smo.FailedOperationException' occurred in Microsoft.SqlServer.Smo.dll
Additional information: This method does not support scripting data.
代码
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服务器 2008R2
- Win 7.0、.NET 4.6.1、VS 2017、SQL服务器 2014
所需的程序集引用:
- Microsoft.SqlServer.ConnectionInfo
- Microsoft.SqlServer.Management.Sdk.Sfc
- Microsoft.SqlServer.Smo
我创建了一个带有确定按钮的简单 Win 表单应用程序并调用了以下函数。
注意:如果编写视图脚本,您需要添加
if( myView.IsSystemObject == true ) continue;
确保系统视图不被脚本化;我没有测试过这个。对于旧版本的 SQL 服务器,您可能还需要对表进行此检查。
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 版本;添加了必需的参考资料;清理示例代码;添加示例连接字符串