C# 如何在测试运行之前创建新的数据库?

C# 如何在测试运行之前创建新的数据库?,c#,.net,sql,nhibernate,C#,.net,Sql,Nhibernate,如何创建新数据库(每次)在从架构文件运行测试之前?删除整个数据库-不要逐表删除-这会增加太多的维护开销删除整个数据库-不要逐表删除-这会增加太多的维护开销我使用以下实用程序方法运行SQL脚本来设置数据库和测试我时不时处理的项目中的数据。它相当有效: internal static void RunScriptFile(SqlConnection conn, string fileName) { long fileSize = 0; using (FileStream stream

如何创建新数据库(每次)在从架构文件运行测试之前?

删除整个数据库-不要逐表删除-这会增加太多的维护开销

删除整个数据库-不要逐表删除-这会增加太多的维护开销

我使用以下实用程序方法运行SQL脚本来设置数据库和测试我时不时处理的项目中的数据。它相当有效:

internal static void RunScriptFile(SqlConnection conn, string fileName)
{
    long fileSize = 0;
    using (FileStream stream = File.OpenRead(fileName))
    {
        fileSize = stream.Length;
        using (StreamReader reader = new StreamReader(stream))
        {
            StringBuilder sb = new StringBuilder();
            string line = string.Empty;
            while (!reader.EndOfStream)
            {
                line = reader.ReadLine();
                if (string.Compare(line.Trim(), "GO", StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    RunCommand(conn, sb.ToString());
                    sb.Length = 0;
                }
                else
                {
                    sb.AppendLine(line);
                }
            }
        }
    }
}

private static void RunCommand(SqlConnection connection, string commandString)
{
    using (SqlCommand command = new SqlCommand(commandString, connection))
    {
        try
        {
            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Console.WriteLine(string.Format("Exception while executing statement: {0}", commandString));
            Console.WriteLine(ex.ToString());
        }
    }
}
我已经使用生成SQL脚本(在某些情况下编辑它们以仅包含我想在测试中使用的数据),并在测试之前将脚本文件路径传递到
RunScriptFile
方法中。该方法解析脚本文件,并分别执行由
GO
行分隔的每个部分(我发现这大大有助于排除运行SQL脚本时发生的错误)


我写代码已经有一段时间了,但我认为它需要脚本文件以
GO
行结尾,以便执行它的最后一部分。

我使用以下实用程序方法来运行SQL脚本,以便在我不时处理的项目中设置数据库和测试数据。它相当有效:

internal static void RunScriptFile(SqlConnection conn, string fileName)
{
    long fileSize = 0;
    using (FileStream stream = File.OpenRead(fileName))
    {
        fileSize = stream.Length;
        using (StreamReader reader = new StreamReader(stream))
        {
            StringBuilder sb = new StringBuilder();
            string line = string.Empty;
            while (!reader.EndOfStream)
            {
                line = reader.ReadLine();
                if (string.Compare(line.Trim(), "GO", StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    RunCommand(conn, sb.ToString());
                    sb.Length = 0;
                }
                else
                {
                    sb.AppendLine(line);
                }
            }
        }
    }
}

private static void RunCommand(SqlConnection connection, string commandString)
{
    using (SqlCommand command = new SqlCommand(commandString, connection))
    {
        try
        {
            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Console.WriteLine(string.Format("Exception while executing statement: {0}", commandString));
            Console.WriteLine(ex.ToString());
        }
    }
}
我已经使用生成SQL脚本(在某些情况下编辑它们以仅包含我想在测试中使用的数据),并在测试之前将脚本文件路径传递到
RunScriptFile
方法中。该方法解析脚本文件,并分别执行由
GO
行分隔的每个部分(我发现这大大有助于排除运行SQL脚本时发生的错误)


我写代码已经有一段时间了,但我认为它需要脚本文件以
GO
行结尾,以便执行它的最后一部分。

您可以使用NHibernate中的SchemaExport类在代码中执行此操作:

var schema = new SchemaExport(config);
schema.Drop(true, true);
schema.Execute(true, true, false);

您可以使用NHibernate中的SchemaExport类在代码中执行此操作:

var schema = new SchemaExport(config);
schema.Drop(true, true);
schema.Execute(true, true, false);

看看这些帖子

Ayende Rahien-
斯科特·穆克-


我发现它们非常有用,基本上他们是在扩展Mike Glenn的示例,看看这些帖子

Ayende Rahien-
斯科特·穆克-

我发现它们非常有用,基本上它们是在扩展Mike Glenn的示例

我使用Proteus(单元测试实用程序),可在Google代码中找到:

您可以创建一组数据。每次运行单元测试时,都会保存当前数据,加载数据集,然后始终使用同一组数据进行测试。最后恢复原始数据

非常有力

HTH

我使用Proteus(单元测试实用程序),可在谷歌代码中找到:

您可以创建一组数据。每次运行单元测试时,都会保存当前数据,加载数据集,然后始终使用同一组数据进行测试。最后恢复原始数据

非常有力


HTH

有无NHibernate?你给它贴上了NHibernate标签,但在问题中没有提到它,有没有NHibernate?您用NHibernate标记了它,但在问题
schema中没有提到它。Drop(true,true)
是不需要的,因为Execute总是在创建
schema之前删除。Drop(true,true)
是不需要的,因为Execute总是在创建
schema之前删除