SSMSSMO对象:获取查询结果我遇到了关于如何使用GO语句执行SQL脚本的教程。现在我想知道我能否获得消息TAB的输出。使用几个GO语句,输出将如下所示:1行受影响912行受影响...但是server.ConnectionContext.ExecuteNonQuery()只能返回一个int,而我需要所有文本。如果查询的某些部分有错误,它也应该放在输出中。任何帮助将不胜感激。最简单的事情可能就是打印您为ExecuteNonQuery获得的数字:introwsAffected=server.ConnectionContext.ExecuteNonQuery(/*...*/);if(rowsAffected!=-1){Console.WriteLine("{0}行受影响。",rowsAffected);这应该有效,但不会SETNOCOUNT当前会话/范围的SETNOCOUNT设置。否则,您会像使用“普通”ADO.NET一样进行操作。不要使用ServerConnection.ExecuteNonQuery()方法,而是通过访问底层SqlConnection对象来创建SqlCommand对象。在那里订阅StatementCompleted事件。using(SqlCommandcommand=server.ConnectionContext.SqlConnectionObject.CreateCommand()){//为“命令”设置其他属性,如StatementText等command.StatementCompleted+=(s,e)=>{Console.WriteLine("{0}行受影响。",e.RecordCount);};命令.ExecuteNonQuery();使用StatementCompleted(与手动打印ExecuteNonQuery()返回的值相反)与SSMS或SQLCMD.EXE的效果完全相同DONE_IN_PROC事件;请参阅MSDN上关于SETNOCOUNT命令的注释。)就我个人而言,我已经在自己的“克隆”中完成了此方法,该方法在SQLCMD.EXE中成功使用。更新:应该注意的是,这种方法(当然)需要您手动拆分GO定界符上的输入脚本/语句,因为您要回退到使用SqlCommand.Execute*(),它不能一次处理多个批次。为此,有多个选项:我选择后一个选项,这是相当多的工作,因为它没有很好的记录并且示例很少(谷歌一下你会找到一些东西,或者使用反射器看看在SMO-Assemblies如何使用这个类)。使用ManagedBatchParser的好处(也许是负担)是它还会为您解析T-SQL脚本的所有其他结构(对于SQLCMD.EXE)。包括:::setvar,:connect,:quit等。当然,如果你的脚本没有使用到相应的ICommandExecutor成员,你也不必实现它们。但是请注意,您可能无法执行“任意”脚本。嗯,这就是你所做的。从如何打印“...受影响的行”的“简单问题”到以稳健和通用的方式做事并不容易(考虑到所需的背景工作)这一事实。祝你好运,YMMV。ManagedBatchParser用法的更新关于如何实现IBatchSource似乎没有很好的文档或示例,这是我的IBatchSource。内部抽象类BatchSource:IBatchSource{privatestringm_content;publicvoidPopulate(){m_content=GetContent();}publicvoidReset(){m_content=null;}受保护的抽象字符串GetContent();publicParserActionGetMoreData(refstringstr){str=null;如果(m_content!=null){str=m_content;m_content=null;}返回ParserAction.Continue;}}内部类FileBatchSource:BatchSource{privatereadonlystringm_fileName;publicFileBatchSource(stringfileName){m_fileName=fileName;}protectedoverridestringGetContent(){returnFile.ReadAllText(m_fileName);}}内部类StatementBatchSource:BatchSource{privatereadonlystringm_statement;公共StatementBatchSource(字符串语句){m_statement=语句;}protectedoverridestringGetContent(){returnm_statement;}}这就是你如何使用它:varsource=newStatementBatchSource("SELECTGETUTCDATE()");源.填充();varparser=newParser();标准杆er.SetBatchSource(来源);/*其他parser.Set*()调用*/parser.Parse();请注意,直接语句(StatementBatchSource)或文件(FileBatchSource)的实现都有一个问题,即它们会立即将全文读入内存我遇到过一个巨大的(!)脚本,其中包含大量生成的INSERT语句。虽然我不认为这是一个实际问题,但SQLCMD.EXE可以处理它。但对于我的生活,我无法弄清楚你需要如何准确地形成为IBatchParser.GetContent()返回的块,以便解析器仍然可以使用它们(看起来它们需要是完整的语句),这违背了目的首先解析......)。以上是C#学习教程:SSMSSMO对象:获取查询结果共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
