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

如何在使用ExecuteNonQuery()时收到错误消息?Share

时间:2023-04-10 20:19:20 C#

使用ExecuteNonQuery()时如何收到错误消息?我以这种方式执行命令:varCommand=newSqlCommand(cmdText,Connection,tr);命令.ExecuteNonQuery();命令中有错误,但.NET不会抛出任何错误消息。我怎么知道命令没有正确执行,我如何得到异常?如果您的错误严重性为16或更高,您只能在C#中获得异常。如果您使用的是PRINT,则不会在.NET中得到异常。如果您可以编辑引发错误代码,这将导致C#中的SqlException:RAISERROR('Someerrormessage',16,1)然后您可以获取SqlException.Errors集合中的每个错误。附带说明-如果之后没有直接的RETURN,SQLServer将在RAISERROR之后继续运行命令。如果不返回,可能会出现多个错误。.NET会抛出一条错误消息...如果严重性为16或更高(因为它抛出异常)-消息将在exception.Message中。如果您使用较低严重性的RAISERROR(或使用PRINT),则必须订阅连接上的InfoMessage事件。ExecuteNonQuery中只会抛出高严重性错误。我观察到OdbcCommand.ExecuteNonQuery()方法的另一种情况。SqlCommand.ExecuteNonQuery()可能也是如此。如果CommandText属性中包含的SQL是单条语句(eg:INSERTINTOtable(col1,col2)VALUES(2,'ABC');)并且如果上面的语句ExecuteNonQuery中存在外键违规或者主键违规会抛出异常。但是,如果您的CommandText是一个批处理,其中包含多个用分号分隔的SQL语句(例如几个INSERTS或UPDATES),并且如果其中一个失败,ExecuteNonQuery将不会抛出异常。您需要明确检查该方法返回的受影响记录的数量。只是将代码放在try{}Catch{}中是无济于事的。尝试以下操作。PS:仅仅因为您使用事务,并不意味着您可以忽略处理异常和回滚。publicstaticvoidMessageEventHandler(objectsender,SqlInfoMessageEventArgse){foreach(SqlErrorerrorine.Errors){Console.WriteLine("problemwithsql:"+error);thrownewException("sql问题:"+error);}}publicstaticintexecuteSQLUpdate(stringdatabase,stringcommand){SqlConnectionconnection=null;SqlCommandsqlcommand=null;整数行=-1;尝试{connection=getConnection(database);connection.InfoMessage+=newSqlInfoMessageEventHandler(MessageEventHandler);sqlcommand=connection.CreateCommand();sqlcommand.CommandText=命令;connection.Open();rows=sqlcommand.ExecuteNonQuery();}catch(Exceptione){Console.Write("executeSQLUpdate:命令问题:"+command+"e="+e);控制台.Out.Flush();thrownewException("executeSQLUpdate:命令有问题:"+command,e);}finally{if(connection!=null){connection.Close();}}返回行;}这是正确的交易处理://publicstaticvoidExecuteInTransaction(Subtext.Scripting.SqlScriptRunnersrScriptRunner)publicoverridevoidExecuteInTransaction(stringstrSQL){System.Data.Odbc.OdbcTransactiontrnTransaction=null;尝试{System.Threading.Monitor.Enter(m_SqlConnection);如果(isDataBaseConnectionOpen()==false)OpenSQLConnection();trnTransaction=m_SqlConnection.BeginTransaction();try{/*foreach(Subtext.Scripting.ScriptscThisScriptinsrScriptRunner.ScriptCollection){System.Data.Odbc.OdbcCommandcmd=newSystem.Data.Odbc.OdbcCommand(scThisScript.ScriptText,m_sqlConnection,trnTransaction);}cmd.ExecuteNonQuery();}*///pfff,单声道C#编译器问题...//System.Data.Odbc.OdbcCommandcmd=newSystem.Data.Odbc.OdbcCommand(strSQL,m_SqlConnection,trnTransaction);System.Data.Odbc.OdbcCommandcmd=this.m_SqlConnection.CreateCommand();cmd.CommandText=strSQL;cmd.ExecuteNonQuery();trnTransaction.Commit();}//结束Trycatch(System.Data.Odbc.OdbcExceptionexSQLerror){Log(strSQL);日志(exSQLerror.Message);日志(exSQLerror.StackTrace);trnTransaction.Rollback();}//EndCatch}//EndTrycatch(Exceptionex){Log(strSQL);日志(例如消息);日志(例如StackTrace);}//最后结束Catch{strSQL=null;如果(m_SqlConnection.State!=System.Data.ConnectionState.Closed)m_SqlConnection.Close();System.Threading.Monitor.Exit(m_SqlConnection);}//EndFinally}//EndSubExecuteInTransaction你用try/catch来捕捉SqlExceptiontry{//......Command.ExecuteNonQuery();}catch(SqlExceptionex){日志(SqlExceptionMessage(ex));}以下方法捕获可以记录或显示给用户的SqlException详细信息foreach(ex.Errors中的SqlError错误){sqlErrorMessages.AppendFormat(“消息:{0}n”,error.Message).AppendFormat(“严重级别:{0}n”,error.Class).AppendFormat(“状态:{0}n",error.State).AppendFormat("编号:{0}n",error.Number).AppendFormat("程序:{0}n",error.Procedure).AppendFormat("Source:{0}n",error.Source).AppendFormat("LineNumber:{0}n",error.LineNumber).AppendFormat("Server:{0}n",error.Server).AppendLine(newstring('-',error.Message.Length+7));}returnsqlErrorMessages;}结果消息如下所示:SqlException:Message:Errorconvertingdata输入nvarchar到日期时间。严重级别:16状态:5编号:8114程序:按年销售来源:.NetSqlClient数据提供程序行号:0服务器:myserver--------------------------------------------------受MHassan、StefanSteiger和MarkGravell的启发thread受工作的启发,这里是一个最小的概念证明示例:以上是C#学习教程:HowdoIgetanerrormessagewhenusingExecuteNonQuery()?全部内容分享,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注—privatestaticvoidDoSql(){//严重级别为10或以下的错误//不会冒泡到.Net作为异常被捕获以通常的方式conststringsql=@"RAISERROR('Atesterrormessageoflowseverity',10,1)";使用(SqlConnectionconn=newSqlConnection(myConnString)){conn.Open();//将我的侦听器连接到连接消息生成器conn.InfoMessage+=newSqlInfoMessageEventHandler(MySqlMessageHandler);使用(SqlCommandcmd=newSqlCommand(sql,conn)){cmd.执行非查询();//代码愉快地继续到这一点//尽管上面发生了sql级别10错误}}}privatestaticvoidMySqlMessageHandler(objectsender,SqlInfoMessageEventArgse){//这会获取SQL执行期间生成的所有消息,//包括低严重性错误消息。foreach(SqlErrorerrine.Errors){//TODO:比这更智能的消息处理方法MessageBox.Show(err.Message);}}本文来自网络收藏,不代表立场,如涉及侵权,请点击维权联系管理员删除,如需转载请注明出处: