当前位置: 首页 > 编程语言 > C#

SqlCommand()ExecuteNonQuery()截断命令文本分享

时间:2023-04-10 21:29:17 C#

SqlCommand()ExecuteNonQuery()截断命令文本执行它们。简单的东西,到目前为止一切顺利。但是我遇到了一个障碍,文件的内容被成功地完整读取,但是一旦传入SqlCommand然后用SqlCommand执行。ExecuteNonQuery只执行部分脚本。我启动了Profiler并确认我的代码没有通过所有脚本。privatevoidExecuteScript(stringcmd,SqlConnectionsqlConn,SqlTransactiontrans){SqlCommandsqlCmd=newSqlCommand(cmd,sqlConn,trans);sqlCmd.CommandType=CommandType.Text;sqlCmd.CommandTimeout=9000000;//用于测试sqlCmd.Execute()NonQuer;}//我这样称呼它,readDMLScript包含543行T-SQL字符串readDMLScript=ReadFile(dmlFile);ExecuteScript(readDMLScript,sqlConn,反式);发送到数据库时每个人都会遇到这个问题。GO不是T-SQL命令。它是所有Microsoft交互式SQL工具(ManagementStudio、isql、osql)都能识别的批处理结束标记。要处理它,您必须编写自己的解析器来分解文件中GO语句之间的每个文本块,并将它们作为单独的命令提供给数据库。如何实现解析器取决于您。它可以很简单(一次读取每一行,检测除GO和空格之外的任何行)或复杂(标记所有语句并确定GO是真实语句还是字符串中的某些文本或多行注释)。就个人而言,我选择了第一个选项。它可以毫无顾虑地处理您可能遇到的所有SQL文件的99%。如果你想全力以赴写一个tokeniser,我相信很多人已经做过了,只需谷歌一下。示例:使用(varreader=newSqlBatchReader(newStreamReader(dmlFile))){stringbatch;while((batch=reader.ReadBatch())!=null){varcmd=newSqlCommand(batch,conn,trans){CommandType=CommandType.Text};cmd.ExecuteNonQuery();}}classSqlBatchReader:IDisposable{privateTextReader_reader;publicSqlBatchReader(TextReaderreader){_reader=reader;}//////返回文件中的下一个命令批次,如果到达文件末尾则返回null。///publicstringReadBatch(){//TODO:在这里实现你的解析逻辑。我在寻找这个问题的答案时发现了这段代码:http://blogs.msdn.com/b/onoj/archive/2008/02/26/incorrect-syntax-near-go-sqlcommand-executenonquery.aspx优点:它简短易懂,完全符合我的需要。缺点:它比基于流的解决方案效率低,并且区分大小写(即“GO”不是“go”)。string[]commands=sql.Split(newstring[]{"GOrn","GO","GOt"},StringSplitOptions.RemoveEmptyEntries);foreach(stringcincommands){varcommand=newSqlCommand(c,masterConnection);命令.ExecuteNonQuery();}ExecuteNonQueryinSMO用于批处理:http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.database.executenonquery.aspx根据原帖回复评论:GO是ManagementStudio/osql/isql的标记。它告诉您向SQLServer发送一批命令。在您的实用程序中,您应该使用GO作为分隔符拆分输入数据并单独发送每个元素(不使用GO命令)这就是我们使用的:)publicstaticclassExtensionMethodsSqlCommand{#regionPublicprivatestaticboolIsGo(stringpsCommandLine){if(psCommandLine==null)返回false;psCommandLine=psCommandLine.Trim();如果(string.Compare(psCommandLine,"GO",StringComparison.OrdinalIgnoreCase)==0)返回真;if(psCommandLine.StartsWith("GO",StringComparison.OrdinalIgnoreCase)){psCommandLine=(psCommandLine+"--").Substring(2).Trim();如果(psCommandLine.StartsWith("--"))返回真;}返回假;}[System.Diagnostics.DebuggerHidden]publicstaticvoidExecuteNonQueryWithGos(thisSqlCommandpoSqlCommand){stringsCommandLong=poSqlCommand.CommandText;使用(StringReaderoStringReader=newStringReader(sCommandLong)){stringsCommandLine;字符串sCommand.Eshort(sCommandLine=oStringReader.ReadLine())!=null)if(ExtensionMethodsSqlCommand.IsGo(sCommandLine)){if(sCommandShort.IsNullOrWhiteSpace()==false){如果((poSqlCommand.Connection.State&ConnectionState.Open)==0)poSqlCommand.Connection.Open();使用(SqlCommandoSqlCommand=newSqlCommand(sCommandShort,poSqlCommand.Connection))oSqlCommand.ExecuteNonQuery();}sCommandShort=string.Empty;}否则sCommandShort+=sCommandLine+"rn";我最终写了一个StringReader的实现来做到这一点,它处理:在列名等中。因此,它仅在用作批定界符时检测关键字GO。这意味着它正确地拆分了SQL文本。如果你在单词GO中添加一个sql终止符(分号),它也会处理它你可以在这里找到它的代码:你可以这样使用它:以上是C#学习教程:SqlCommand()ExecuteNonQuery()truncatesthecommand如果文分享的全部内容对你有用,需要进一步了解C#学习教程,希望你多多关注——using(varreader=newSqlCommandReader(scriptContents)){varcommands=newList();reader.ReadAllCommands(c=>commands.Add(c));//命令现在包含每个单独的sql批处理。}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: