如何获取使用 ExecuteNonQuery() 时发生的错误消息?
我正在以这种方式执行命令:
var Command = new SqlCommand(cmdText, Connection, tr);
Command.ExecuteNonQuery();
命令中出现错误,但是 .NET 不会抛出任何错误消息。我怎么知道命令没有正确执行,以及如何获取异常?
I am executing a command in this way :
var Command = new SqlCommand(cmdText, Connection, tr);
Command.ExecuteNonQuery();
In the command there is an error, however .NET does not throw any error message. How could I know that the command did not executed properly, and how to get the exception?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
仅当错误的严重性为 16 或更高时,您才会在 C# 中收到异常。如果您使用 PRINT,则在 .NET 中不会出现异常。
如果您可以编辑引发错误代码,这将导致 C# 中的 SqlException:
然后您可以获取 SqlException.Errors 集合中的每个单独错误。
顺便说一句 - 如果您之后不直接
RETURN
,SQL Server 将在RAISERROR
之后继续运行命令。如果不返回,可能会返回多个错误。You'll only get an exception in C# if your error's severity is 16 or above. If you are using a PRINT, you won't get an exception in .NET.
If you can edit the raise error code, this would cause a SqlException in C#:
You can then get to each individual error in the SqlException.Errors collection.
Just a side-note - SQL Server will continue to run commands after the
RAISERROR
if you don'tRETURN
directly afterwards. If you don't return, you can get multiple errors back..NET 确实会引发错误消息...如果严重性为 16 或更高(因为它引发异常) - 该消息将位于异常
.Message
中。如果您使用严重性较低的RAISERROR
(或使用PRINT
),则必须订阅 连接上的InfoMessage
事件。.NET does indeed raise an error message... if the severity is 16 or above (since it throws an exception) - the message will be in the exception
.Message
. If you are usingRAISERROR
with a lower severity (or usingPRINT
) then you will have to subscribe to theInfoMessage
event on the connection.只有高严重性错误才会在 ExecuteNonQuery 中被抛出。我用 OdbcCommand.ExecuteNonQuery() 方法观察到了另一种情况。对于 SqlCommand.ExecuteNonQuery() 来说可能也是如此。如果 CommandText 属性中包含的 SQL 是单个语句(例如:INSERT INTO table (col1,col2) VALUES (2,'ABC'); )并且上述语句中存在外键冲突或主键冲突 ExecuteNonQuery会抛出异常。但是,如果您的 CommandText 是一个批处理,其中有多个由分号分隔的 SQL 语句(例如多个插入或更新),并且其中一个失败,则 ExecuteNonQuery 不会抛出异常。您需要显式检查该方法返回的受影响的记录数。简单地将代码放入 try{}Catch{} 中是没有帮助的。
Only high severity errors will be thrown back in ExecuteNonQuery. There is another scenario that I have observed with OdbcCommand.ExecuteNonQuery() method. May be this is true for SqlCommand.ExecuteNonQuery() as well. If the SQL contained in the CommandText property is a single statement (Example: INSERT INTO table (col1,col2) VALUES (2,'ABC'); ) and if there is a foreign key violation or primary key violation in the above statement ExecuteNonQuery will throw an exception. However, if your CommandText is a batch where you have more than one SQL Statements seperated by semi colon (Like Several INSERTS or UPDATES) and if one of them fails ExecuteNonQuery does not throw an exception back. You need to be explicitly checking for the number of records affected returned by the method. Simply putting the code in a try{}Catch{} wont help.
受到 M Hassan、Stefan Steiger 和 Mark Gravell 在本主题中的工作的启发,以下是此处发生的情况的最小概念验证示例:
Inspired by the work of M Hassan, Stefan Steiger, and Mark Gravell in this thread, here is a minimum proof-of-concept example of what is going on here:
我发现这在 Oracle ODP.Net 的 WCF 服务中非常适合我 -
I found this to work well for me in a WCF service with Oracle ODP.Net -
使用此代码,当命令完成时,它将返回错误:
这是我的完整类代码:
Use this code and when the command is finished it will return the error:
and this is my full class code:
尝试下面的方法。
PS:仅仅因为您使用事务,并不意味着您可以忽略处理异常和回滚。
这是正确的事务处理:
Try the below.
PS: Just because you use a transaction, doesn't mean you can neglect handling exceptions and rollbacks.
And this is proper transaction handling:
您可以使用 try/catch 捕获 SqlException
以下方法 Catch 可以记录或向用户显示 SqlException 的详细信息
生成的消息如下所示:
You catch the SqlException using try/catch
The following Method Catch details of SqlException which can be logged or displayed to user
The Generated message look like: