C# SMO 数据库不记录创建

Posted

技术标签:

【中文标题】C# SMO 数据库不记录创建【英文标题】:C# SMO Database do not log creation 【发布时间】:2018-01-22 14:16:53 【问题描述】:

我有一个创建Microsoft.SqlServer.Management.Smo.Database 类型数据库的集成测试:

var defaultConnectionConnectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();
var sqlConnection = new SqlConnection(defaultConnectionConnectionString);
var serverConnection = new ServerConnection(sqlConnection);
 _server = new Server(serverConnection);
 _database = new Database(_server, _integrationTestingDatabaseName);
 _database.Create();

当我通过 CLI for NUnit 运行集成测试时,当测试完成时,用于创建数据库的 SQL 被转储到控制台。这会使输出变得混乱,这不是我在运行此集成测试时想要看到的。我怎样才能阻止这种情况发生?

【问题讨论】:

当我在控制台应用程序(VS2015/Smo 12.0)中运行上述内容时,我没有得到任何 SQL 输出。您是否也在控制台应用程序中看到相同的行为?仅在使用 NUnit CLI 运行时才会发生这种情况吗?事实上,对我来说,我希望看到生成的 SQL 被记录下来!另外,你的 Smo 程序集是什么版本? 您打算回答以上问题吗? 【参考方案1】:

这是一场鹅追逐,无法复制。

我猜可能会有一些混乱,也许您的一个脚本会使用SQL Print 或类似的红鲱鱼。因为执行此单元测试以通过 Sql Management Objects 创建 SQL dB 并输出 SQL 创建脚本。

即使直接从命令行执行也不会记录 SQL 创建脚本。这是再现:

using NUnit.Framework;
using ConsoleApplication1;
using System.IO;
using System.Diagnostics;

[TestFixture]
public class UnitTest1
    
    static FileStream objStream;

    [SetUp]
    public static void Setup()
    
        objStream = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "\\AAA_Output.txt", FileMode.OpenOrCreate);
        TextWriterTraceListener objTraceListener = new TextWriterTraceListener(objStream);
        Trace.Listeners.Add(objTraceListener);
        Trace.WriteLine("===================================");
        Trace.WriteLine("App Start:" + DateTime.Now);
        Trace.WriteLine("===================================");
    

    [TestCase]
    public void TestMethod1()
    
        Program.CreateDB();
    

    [TearDown]
    public static void TearDown()
    
        Trace.Flush();
        objStream.Close();
    

结果:

【讨论】:

以上是关于C# SMO 数据库不记录创建的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用 SMO 使用 FILE STREAM 备份和恢复数据库

ScriptingOptions sql smo 不支持脚本数据

如何使用 SMO 在存储过程中调用 c# 函数?

如何设置 SMO ScriptingOptions 以保证表的精确副本?

SMO:恢复到不同的数据库,为啥 db 为空?

C# - 创建新的 SQL Server 数据库导致错误