C# try-catch块中的对象

C# try-catch块中的对象,c#,error-handling,try-catch,C#,Error Handling,Try Catch,以以下代码示例为例: string status = "ok"; SqlCommand cmd=null; SqlTransaction trans=null; try { cmd = defs.prepquery(""); trans = cmd.Connection.BeginTransaction(); cmd.Transaction = trans; } catch (Exception ex) { status = defs.logerror("ini

以以下代码示例为例:

string status = "ok";
SqlCommand cmd=null;
SqlTransaction trans=null;
try
{
    cmd = defs.prepquery("");
    trans = cmd.Connection.BeginTransaction();
    cmd.Transaction = trans;

}
catch (Exception ex)
{
    status = defs.logerror("initalizing sql transaction:" + ex.ToString());
    return status;
}

try
{
    if (oper == "submit")
    {
        cmd.CommandText = "update DCM_Mapping_Sessions set StatusID=2 " + 
            "where MappingSessionID=" + mpsid + "";
        cmd.ExecuteNonQuery();
    }
    else if (oper == "delete")
    {
        // .......etc etc 
    }
    catch(Exception ex2)
    {
        //rollback , close the connection
       // handle the ex 
    }

    // if everything is ok , comit the transaction and close the connection
}
所以我的问题是:当异常发生时,try块中的对象会发生什么情况? C#是否允许我懒惰并销毁对象(销毁挂起的事务意味着回滚)并在发生异常时关闭连接

我来自C\C++背景,所以我做上述工作是为了安全,如果下面某个地方发生异常,不会以打开的事务结束

看一看

它完全符合你的要求

因此,您的代码如下所示:

try
{
   //try something
}
catch(Exception ex2)
{
   // handle the ex 
}
finally
{
    //rollback , close the connection
}
看一看

它完全符合你的要求

因此,您的代码如下所示:

try
{
   //try something
}
catch(Exception ex2)
{
   // handle the ex 
}
finally
{
    //rollback , close the connection
}

您应该正在处理/关闭连接和事务

最好的方法是将创建内容包装在一个文件中

提供方便的语法,确保正确使用IDisposable对象

本质上,
using
语句将对象的创建封装在块中,以确保正确处理

    using(var cmd = defs.prepquery(""))
    using(var trans = cmd.Connection.BeginTransaction())
    {

    }

您应该正在处理/关闭连接和事务

最好的方法是将创建内容包装在一个文件中

提供方便的语法,确保正确使用IDisposable对象

本质上,
using
语句将对象的创建封装在块中,以确保正确处理

    using(var cmd = defs.prepquery(""))
    using(var trans = cmd.Connection.BeginTransaction())
    {

    }
简短的回答是否定的

回答更长,是的,但为时已晚

这就是为什么我们有条款和区块。您负责呼叫关闭或处置

当垃圾收集器被迫为您“缓慢”地执行此操作时,它们将被关闭或处理,但在不确定的时间段内,您昂贵的资源将被不必要地浪费

这样比较好

using(var connection = defs.GetConnection())
using(var cmd = new SqlCommand())
{
    cmd.Connection = connection;
    switch(oper)
    {
        case "submit":
             cmd.CommandText = "update DCM_Mapping_Sessions" +
                               "set StatusID=2" +
                               "where MappingSessionID=" + mpsid;
        case "...
    }

    try
    {
        cmd.ExecuteNonQuery();
    }
    catch(SomeSpecificExceptionIShouldActuallyHandleHere ex)
    {
       ...
    }
}
可能的注射攻击放在一边。

简短回答,否

回答更长,是的,但为时已晚

这就是为什么我们有条款和区块。您负责呼叫关闭或处置

当垃圾收集器被迫为您“缓慢”地执行此操作时,它们将被关闭或处理,但在不确定的时间段内,您昂贵的资源将被不必要地浪费

这样比较好

using(var connection = defs.GetConnection())
using(var cmd = new SqlCommand())
{
    cmd.Connection = connection;
    switch(oper)
    {
        case "submit":
             cmd.CommandText = "update DCM_Mapping_Sessions" +
                               "set StatusID=2" +
                               "where MappingSessionID=" + mpsid;
        case "...
    }

    try
    {
        cmd.ExecuteNonQuery();
    }
    catch(SomeSpecificExceptionIShouldActuallyHandleHere ex)
    {
       ...
    }
}

可能的注入攻击放在一边。

try-catch块中的对象可能看起来比它们更接近。您没有使用
使用
块有什么原因吗?如果
mpsid
是一个字符串参数,您可以接受注入攻击。try-catch块中的对象可能比它们看起来更接近。您没有使用
块有什么原因吗
使用
blocks?如果
mpsid
是一个字符串参数,您会受到注入攻击+1,那么如果您输入一些代码,例如打开/关闭数据库连接,来填写您的示例,就会有所帮助。@egrunin我考虑过这一点,但我已经有一段时间没有用C#编码数据库连接了,我不想给出错误的代码(来自内存)作为示例-所以我只使用了原始问题中的占位符。+1如果您输入一些代码,例如打开/关闭数据库连接,来填写您的示例,将会有所帮助。@egrunin我考虑过这一点,但我已经有一段时间没有用C#编码数据库连接了,我不想给出错误的代码(来自内存)作为示例,所以我只使用了原始问题中的占位符。