从C#运行嵌入式SQL文件会出错,但从SSMS运行不会

时间:2016-03-27 22:37:28

标签: c# embedded-resource

我有一个简单的.sql文件,如下所示:

    USE [master]
    GO

    CREATE DATABASE [NEW_DATABASE]
    GO

当我从SSMS运行它时,它工作正常,创建了NEW_DATABASE数据库。但是,我试图通过将其用作C#程序中的嵌入式资源来运行此命令。这个.sql文件的最终版本会复杂得多,但是现在,我只是想让这个简单的脚本工作。

以下是我采取的步骤:

1) I added a resource file (named SqlFiles) to my project.

2) I opened the resource file within VS and added a new file
resource, "create.sql".

3) I saved the resource file.

然后,在我的代码中,我有以下内容:

// If database doesn't exist, run the script to create it.
if (dbExists == false)
{
    using (var connection = new SqlConnection("Data Source=" + computerName + "\\SQLEXPRESS;Initial Catalog=master;Integrated Security=True"))
    {
        connection.Open();
        var command = connection.CreateCommand();
        command.CommandText = SqlFiles.create;
        command.ExecuteNonQuery();
    }  
}

运行程序时,执行命令时出现以下错误:

Incorrect syntax near 'GO'.

然而,正如我所说的,如果我在SSMS中打开同一个文件并执行它,它就可以正常运行。

我注意到当我将鼠标悬停在调试中的command变量上时,CommandText的值似乎包含格式化文本(返回字符,而不是):

USE [master]\r\nGO\r\nCREATE DATABASE [NEW_DATABASE]\r\nGO\r\n

这可能是这个问题吗?

1 个答案:

答案 0 :(得分:4)

GO关键字不是T-SQL,换句话说就是c#与数据库交互的方法。 Go是一个Sql Server Managent Studio关键字,它告诉SQL脚本作为单独的命令执行。所以SSMS在GO脚本中分批运行。

您需要自己单独分开并运行批次,并告诉每个批次执行。或者,如果未生成脚本,我将它们存储为存储过程并将我的参数传递给它。