C# 正在从SQL Server事务引发异常

C# 正在从SQL Server事务引发异常,c#,.net,sql-server,exception,C#,.net,Sql Server,Exception,NET应用程序连接到SQL Server数据库。事务查询存储在C#代码的字符串中: 此查询按如下方式执行: try { using (SqlConnection conn = new SqlConnection(Configuration.connectionString)) { SqlCommand cmd = new SqlCommand(query,conn); conn.Open(); cmd.ExecuteNonQuery();

NET应用程序连接到SQL Server数据库。事务查询存储在C#代码的字符串中:

此查询按如下方式执行:

try
{
    using (SqlConnection conn = new SqlConnection(Configuration.connectionString))
    {
       SqlCommand cmd = new SqlCommand(query,conn);
       conn.Open();
       cmd.ExecuteNonQuery();
    }
}
catch (Exception ex)
{
    // By the way, I know it is bad practice to catch a System.Exception.
}

如果在查询本身中发生异常,并且我如上所述抛出它,它是否会被捕获为C#代码中的try-catch块?

如您所述,如果抛出它,那么它将被catch捕获

是。这句话是因为注释至少需要由15个字符组成。请阅读此()以了解T-SQL错误处理的详细说明。我没有在您的代码中看到显式的
提交事务
,因此您可能会从阅读series@AlyElhaddad,将在此处引发异常,因为您正在使用
ExecuteNonQuery
。异常可能会被捕获,也可能不会被捕获,这取决于T-SQL和应用程序代码以及其他执行方法。有关更多信息,请参阅。我假定您指的是
提交
,而不是
结束事务
,这是不合法的T-SQL。请注意,
begintransaction
/
COMMIT
不会形成实际的块(就像
BEGIN TRY..END CATCH
那样),尽管您可以使用缩进来建议它这样做。如果您只想使整个过程原子化,那么最好在客户端代码中使用显式的
.BeginTransaction
,因为至少在这方面,您不会与t-SQL中可能出现错误的许多方式发生冲突。(至少你希望
设置XACT_ABORT ON
——阅读@MartinCairney提供的背景信息。)@DanGuzman如果我想
ExecuteQuery
返回一些结果,但仍然想抛出一个C#会捕获的异常,该怎么办?
try
{
    using (SqlConnection conn = new SqlConnection(Configuration.connectionString))
    {
       SqlCommand cmd = new SqlCommand(query,conn);
       conn.Open();
       cmd.ExecuteNonQuery();
    }
}
catch (Exception ex)
{
    // By the way, I know it is bad practice to catch a System.Exception.
}