首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SqlCommand() ExecuteNonQuery()截断命令文本

SqlCommand() ExecuteNonQuery()截断命令文本
EN

Stack Overflow用户
提问于 2010-03-17 01:15:17
回答 5查看 15.1K关注 0票数 16

我正在构建一个自定义的数据库部署实用程序,我需要读取包含sql脚本的文本文件,并对数据库执行它们。

非常简单的东西,到目前为止还不错。

然而,我遇到了一个问题,文件的内容被成功地完整地读取了,但是一旦传入SqlCommand,然后用SqlCommand.ExecuteNonQuery执行,就只执行了脚本的一部分。

我启动了Profiler,并确认我的代码没有传递所有脚本。

代码语言:javascript
复制
    private void ExecuteScript(string cmd, SqlConnection sqlConn, SqlTransaction trans)
    {

        SqlCommand sqlCmd = new SqlCommand(cmd, sqlConn, trans);
        sqlCmd.CommandType = CommandType.Text;
        sqlCmd.CommandTimeout = 9000000; // for testing
        sqlCmd.ExecuteNonQuery();

    }

    // I call it like this, readDMLScript contains 543 lines of T-SQL
    string readDMLScript = ReadFile(dmlFile);
    ExecuteScript(readDMLScript, sqlConn, trans);
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-17 04:12:37

是的,每个人在第一次开始将SQL脚本文件的内容发送到数据库时都会遇到这个问题。

GO不是T-SQL命令。它是所有Microsoft交互式SQL工具(Management Studio、isql、osql)都能识别的批次结束标记。为了处理它,您必须编写自己的解析器,在GO语句之间分解文件中的每个文本块,并将它们作为单独的命令提供给数据库。

如何实现您的解析器取决于您。它可以很简单(一次读取每一行,检测只包含GO和空格的行),也可以很复杂(标记所有语句,并判断GO是真正的语句还是字符串或多行注释中的一小段文本)。

就我个人而言,我选择了第一种选择。它可以轻松处理你可能遇到的99%的SQL文件。如果你想全力以赴写一个记号,我相信很多人已经做过了,只要用谷歌搜索就行了。

示例:

代码语言:javascript
复制
using(var reader = new SqlBatchReader(new StreamReader(dmlFile))) {
    string batch;
    while((batch = reader.ReadBatch()) != null) {
        var cmd = new SqlCommand(batch, conn, trans) { CommandType = CommandType.Text };
        cmd.ExecuteNonQuery();
    }
}

class SqlBatchReader : IDisposable {
    private TextReader _reader;
    public SqlBatchReader(TextReader reader) {
        _reader = reader;
    }
    /// <summary>
    /// Return the next command batch in the file, or null if end-of-file reached.
    /// </summary>
    public string ReadBatch() {
        // TODO: Implement your parsing logic here.
    }
}
票数 35
EN

Stack Overflow用户

发布于 2013-11-19 07:06:22

在搜索此问题的答案时,我找到了以下代码:

http://blogs.msdn.com/b/onoj/archive/2008/02/26/incorrect-syntax-near-go-sqlcommand-executenonquery.aspx

优点:它简洁易懂,完全符合我的需求。

缺点:它比基于流的解决方案效率低,并且区分大小写(即"GO“而不是"go")。

代码语言:javascript
复制
string[] commands = sql.Split(new string[]{"GO\r\n", "GO ", "GO\t"}, StringSplitOptions.RemoveEmptyEntries );
foreach (string c in commands)
{
    var command = new SqlCommand(c, masterConnection);
    command.ExecuteNonQuery();
}
票数 5
EN

Stack Overflow用户

发布于 2012-01-12 09:24:44

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2456552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档