【问题标题】:Get Sql server's data using smo使用smo获取Sql server的数据
【发布时间】:2012-11-05 14:19:51
【问题描述】:

我正在使用 Sql Server Smo 通过 C# 应用程序创建数据库方案。但是,我需要更多,我还需要从每个表中获取数据作为 脚本,如下所示:

--........................................
INSERT INTO Table123 (...) VALUES (....)
INSERT INTO Table456 (...) VALUES (....)
--........................................

我该怎么做?有可能吗?请注意,我需要使用 smo 而不是 *.bak 数据库等来创建一个脚本。

【问题讨论】:

  • 为什么不在smo 状态下使用实体框架代码优先方法?它也创建数据库模式。您还可以手动生成用于插入/更新/删除的 sql 脚本。检查this link
  • 据我所知,SQL Server 无法以INSERT 脚本的形式转储其数据。您可以使用 BCP 来生产,例如csv 文件和格式文件,但它不符合您要求的格式。
  • 如果您正在构建架构,为什么不能将该脚本构建为文本。
  • 好吧,可以结合 SMO 来枚举表/列/任何东西来获取 DDL,并使用经典查询来构建字符串脚本,因为 Smo.Scripter 不会创建 DML。
  • 事实证明,如果您使用 ScriptData = true 选项和 Scripter.EnumScript 方法,Smo.Scripter 生成 DML。至少它对我有用(请参阅我的回答中的示例)。

标签: c# .net sql-server smo


【解决方案1】:

看看 SMO 的 Scripter 课程。以下基本示例适用于我:

using System.Data.SqlClient;
using System.IO;
using System.Text;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;

namespace SqlExporter
{
class Program
{
static void Main(string[] args)
{
    var server = new Server(new ServerConnection {ConnectionString = new SqlConnectionStringBuilder {DataSource = @"LOCALHOST\SQLEXPRESS", IntegratedSecurity = true}.ToString()});
    server.ConnectionContext.Connect();
    var database = server.Databases["MyDatabase"];
    var output = new StringBuilder();

    foreach (Table table in database.Tables)
    {
        var scripter = new Scripter(server) {Options = {ScriptData = true}};
        var script = scripter.EnumScript(new SqlSmoObject[] {table});
        foreach (var line in script)
            output.AppendLine(line);
    }
    File.WriteAllText(@"D:\MyDatabase.sql", output.ToString());
}
}
}

注意:此示例不处理任何外键约束或表之间的其他依赖关系。

参考资料:

  1. This SO question(这让我转上了Scripter 课程)
  2. This MSDN forum question(解释了如何使用EnumScript 方法)

【讨论】:

  • 有没有办法只编写表格的一部分数据? (表达 where 条件)
  • 我也在尝试这样做,即表达 where 条件,有谁知道 SMO 是否可以做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
相关资源
最近更新 更多