【问题标题】:c# generating INSERT script with data from databasec# 使用数据库中的数据生成 INSERT 脚本
【发布时间】:2018-03-12 14:02:30
【问题描述】:

我尝试生成一个包含 INSERT 脚本形式的数据的脚本, 我尝试使用参考(见下文)来做到这一点

using Microsoft.SqlServer.Management.Smo;

使用此代码草案

Server serv = new Server(db);
Database simba = serv.Databases[dbname];
string script = "";

ScriptingOptions so = new ScriptingOptions()
{
    ScriptData = true,
    ScriptSchema = false,
    ScriptDrops = false
};

foreach (Table tb in simba.Tables)
{
    if (tables.Contains(tb.Name))
    {
        var sc = tb.Script(so);
        foreach (var s in sc)
            script += s;

    }
    using (StreamWriter writer = new StreamWriter(file))
    {
        foreach (string tab in tables)
        writer.WriteLine(script);
    }
}

但是这段代码会出错

var sc = tb.Script(so);

这是

Microsoft.SqlServer.Management.Smo.FailedOperationException

感谢大家的回复

【问题讨论】:

  • 异常详细信息的其余部分是什么?
  • 显示您正在运行的脚本示例
  • @bugfinder 我认为他们正在尝试使用脚本生成字符串,而不是运行它们。您是否尝试过显式输入字符串?
  • @Crowcoder Microsoft.SqlServer.Management.Smo.FailedOperationException: Cette method ne prend pas en charge le script de données。 à Microsoft.SqlServer.Management.Smo.SqlSmoObject.ScriptImpl(ScriptingOptions so) à Microsoft.SqlServer.Management.Smo.TableViewTableTypeBase.Script(ScriptingOptions scriptingOptions)à generateScriptSQL.Program.Main(String[] args) dans c:\users\ cad\Source\Repos\generateScriptSQL\generateScriptSQL\Program.cs:ligne 84
  • @JacobH 你的意思是没有生成?我可以直接在 mssql 上使用发布者向导,但我尝试自动化我的任务

标签: c# sql-server smo


【解决方案1】:

我有这个代码,它工作正常尝试使用它

var report   = string.Empty;
var fileName = Server.MapPath(Constants.BACKUP_FILE_NAME);

var server      = new Server(new ServerConnection(new SqlConnection(Constants.BACKUP_CONNECTION_STRING)));
var options     = new ScriptingOptions();
var databases   = server.Databases[Constants.BACKUP_DATABASE_NAME];                    

options.FileName                = fileName;
options.EnforceScriptingOptions = true;
options.WithDependencies        = true;
options.IncludeHeaders          = true;
options.ScriptDrops             = false;
options.AppendToFile            = true;
options.ScriptSchema            = true;
options.ScriptData              = true;
options.Indexes                 = true;

report = "<h4>Table Scripts</h4>";
foreach (var table in Constants.BACKUP_TABLES)
{
    databases.Tables[table, Constants.BACKUP_SCHEMA_NAME].EnumScript(options);                        
    report += "Script Generated: " + table + "<br>";
}

“常量”是我的类,用于保存文件名、数据库等常量值,我正在为有限的表生成脚本,因此不要像在代码中那样执行“simba.Tables”;如果您希望生成每个表脚本,您当然可以这样做。所以这段代码会生成脚本并将其存储到指定的文件中。

希望对你有帮助

【讨论】:

    【解决方案2】:

    感谢@Zaki Mohammed,

    你的代码对我帮助很大,

    我只是针对我的情况稍作修改,效果很好,

                Server serv = new Server(db);
                Database simba = serv.Databases[dbname];
                Scripter scripter = new Scripter(serv);
                scripter.Options.FileName = "InsertIntoScript.sql";
                scripter.Options.EnforceScriptingOptions = true;
                scripter.Options.WithDependencies = false;
                scripter.Options.IncludeHeaders = true;
                scripter.Options.ScriptDrops = false;
                scripter.Options.AppendToFile = true;
                scripter.Options.ScriptSchema = false;
                scripter.Options.ScriptData = true;
                scripter.Options.Indexes = false;
    
                string script = "";
                foreach (Table tb in simba.Tables)
                {
                    if (tables.Contains(tb.Name))
                    {
                        IEnumerable<string> sc = scripter.EnumScript(new Urn[] { tb.Urn });
                        foreach (var s in sc)
                            script += s;
                    }
                }
    

    【讨论】:

    • 注意:脚本 += 内容对于大数据可能会非常慢。使用以下内容让我从三分钟多到大约 7 秒。 StringBuilder 脚本 = new StringBuilder(); ... script.Append(s);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2019-04-30
    • 2023-04-03
    相关资源
    最近更新 更多