代码之家  ›  专栏  ›  技术社区  ›  Stefan Steinegger

ADO.NET和ExecuteOnQuery:如何使用DDL

  •  0
  • Stefan Steinegger  · 技术社区  · 15 年前

    我执行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 不存在。它似乎在执行之前对其进行解析和验证。

    GO 在陈述之间,那么它就起作用了。当我把 去吧

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


    如果有人对我的实现感兴趣,根据John Saunders的回答:

    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);
        }
    }
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Kevin Holditch    10 年前

    必须分别运行每个批。特别是,要运行可能包含多个批处理(“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
    }
    
        2
  •  2
  •   ZXX    14 年前

    为了在运行进行结构更改的脚本时完全安全,请使用SMO而不是SqlClient,并确保MARS没有通过连接字符串打开(无论如何,SMO通常会抱怨)。寻找 服务器连接

    区别在于smodll将脚本按原样传递给SQL,因此它真正等同于在SSMS中或通过isqlcmd行运行它。每次遇到另一个小问题时,GO-s上的切片都会变成更大的扫描(比如GO可能位于多行注释的中间,可能有多个USE语句,脚本可能会删除SqlCLient连接到的数据库-oops:-)。我刚刚在继承的代码库中删除了一个这样的东西(在更复杂的脚本与MARS冲突之后,MARS对生产代码有好处,但对管理类的东西没有好处)。