ADO.NET和的ExecuteNonQuery:如何使用DDL(ADO.NET and Execu

2019-10-28 19:08发布

我执行SQL脚本来更改数据库架构。 它看起来是这样的:

using (var command = connection.CreateCommand())
{
    command.CommandText = script;
    command.ExecuteNonQuery();
}

另外,该命令在事务内执行。

该纸条是这样的:

Alter Table [TableName]
ADD [NewColumn] bigint NULL

Update [TableName]
SET [NewColumn] = (SELECT somevalue FROM anothertable)

我得到一个错误,因为NewColumn不存在。 这似乎解析和在执行之前验证它。

当我执行在Management Studio中整个的东西,我可以把GO语句之间,那么它的工作原理。 当我把GO到脚本,ADO.NET抱怨(附近有语法错误“GO”)。

我可以在脚本分成单独的脚本,并在单独的命令执行它,这将是很难处理的。 我可以每拆呢GO ,解析脚本自己。 我只是觉得应该有一个更好的解决办法,我不明白的东西。 应该如何这样的脚本执行?


我的实现,如果有人有兴趣,根据约翰·桑德斯的回答:

List<string> lines = new List<string>();
while (!textStreamReader.EndOfStream)
{
    string line = textStreamReader.ReadLine();
    if (line.Trim().ToLower() == "go" || textStreamReader.EndOfStream)
    {
        ExecuteCommand(
            string.Join(Environment.NewLine, lines.ToArray()));

        lines.Clear();
    }
    else
    {
        lines.Add(line);
    }
}

Answer 1:

你必须单独运行各批次。 特别是要运行可能包含多个批次(“GO”的关键字)的脚本,你必须在“GO”关键字拆分脚本。

未测试:

string script = File.ReadAllText("script.sql");
string[] batches = script.Split(new [] {"GO"+Environment.NewLine}, StringSplitOptions.None);
foreach (string batch in batches)
{
    // run ExecuteNonQuery on the batch
}


Answer 2:

不使用的许许多多的ORM库一个做到这一点? 好:-)

要运行做结构变化脚本时完全安全使用SMO而不是SqlClient中,并确保MARS不是通过连接字符串打开(SMO通常会抱怨,如果它是无论如何)。 寻找一个ServerConnection类的ExecuteNonQuery -不同的DLL当然:-)

该差异是SMO DLL pases的脚本,是SQL因此它在SSMS或通过ISQL CMD线运行它的真正的等价物。 在GO-S切片结束了每次遇到另一个毛刺(像GO可以在多行注释中间,可以有多种用途发言的时间成长为更大的扫描,脚本,可以扫掉非常DB是SQLCLIENT连接 - 哎呀:-)。 我刚刚杀了一个这样的东西在我继承了代码库(与MARS发生冲突更加复杂的脚本后MARS是良好的生产代码,而不是管理的东西)。



文章来源: ADO.NET and ExecuteNonQuery: how to use DDL