运行 来自 C# 的嵌入式 SQL 文件出错,但来自 SSMS 的 运行 没有

Running embedded SQL file from C# gets errors, but running from SSMS does not

我有一个简单的 .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 的值似乎包含格式文本(return 个字符):

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

会不会是这个问题?

GO 关键字不是 T-SQL,或者换句话说,您的 C# 与数据库交互的方法。 Go 是一个 Sql Server Managent Studio 关键字,它告诉 SQL 脚本作为单独的命令执行。因此脚本中的 SSMS 运行s 以 GO 分隔的批次。

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