相关疑难解决方法(0)

为什么使用带有SqlTransaction的using语句?

我一直在遇到一些与我在我的代码中使用的SqlTransaction有关的问题.在我的谷歌搜索期间,我看到许多人使用带有SqlTransaction的using语句.

使用SqlTransaction这种类型的语句有什么好处和/或区别?

using (SqlConnection cn = new SqlConnection())
{
     using (SqlTransaction tr = cn.BeginTransaction())
     {
      //some code
      tr.Commit();
     }
}
Run Code Online (Sandbox Code Playgroud)

目前我的代码如下所示:

SqlConnection cn = new SqlConnection(ConfigurationManager.AppSettings["T3"]);
cn.Open();
SqlTransaction tr = cn.BeginTransaction();

try
{
     //some code
     tr.Commit();
     cn.Close();
}
catch(Exception ex)
{
      tr.Rollback();
      cn.Close();
      throw ex;
}
Run Code Online (Sandbox Code Playgroud)

一种方式优于另一种方式的优势是什么?

c# using-statement

47
推荐指数
4
解决办法
5万
查看次数

显式调用事务回滚或让异常触发隐式回滚是一种更好的做法吗?

在下面的代码中,如果在执行SQL语句时抛出任何异常,我们应该期望在事务未提交时对事务进行隐式回滚,它会超出范围并被处置掉:

using (DbTransaction tran = conn.BeginTransaction())
{
    //
    // Execute SQL statements here...
    //
    tran.Commit();
}
Run Code Online (Sandbox Code Playgroud)

以上是一种可接受的做法,还是应该捕获异常并显式调用tran.Rollback(),如下所示:

using (DbTransaction tran = conn.BeginTransaction())
{
    try
    {
        //
        // Execute SQL statements here...
        //
        tran.Commit();
    }
    catch
    {
        tran.Rollback();
        throw;
    }
}
Run Code Online (Sandbox Code Playgroud)

sql transactions rollback

20
推荐指数
1
解决办法
5548
查看次数

用于IDbConnection/IDbTransaction安全使用?

虽然我的假设似乎听起来很主观,但经过一些研究后,我发现找到喜欢虚拟对象的开发人员Try/Catch而不是使用Using语句进行IDbConnection/IDbTransaction处理(Close/Commit/Rollback)并不罕见.

即使是一些经验最丰富的开发人员和一些新开发人员也是如此.我故意不会在StackOverflow或论坛链接上引用任何问题作为示例,因此人们不会被冒犯.根据我的发现,使用声明是安全的(没有双关语).

它有什么问题吗?请考虑以下代码:

Public Sub Commit()
  Dim cn As IDbConnection = {CREATE_CONNECTION}
  Dim tran As IDbTransaction = Nothing

  cn.Open()
  Try
    tran = cn.BeginTransaction
    'run some queries here
    tran.Commit()
  Catch ex As Exception
    If Not tran Is Nothing Then tran.Rollback()
    Throw
  Finally
    cn.Close()
  End Try
End Function
Run Code Online (Sandbox Code Playgroud)

假设{CREATE_CONNECTION}是一个Sub创建连接的占位符,具体取决于数据库供应商,根据所有可能的最佳实践编写,并且不需要更多改进.

有没有理由说上面的代码不能这样重写:

Using cn As IDbConnection = {CREATE_CONNECTION}
  cn.Open()
  Using tran As IDbTransaction = cn.BeginTransaction
    'run some queries …
Run Code Online (Sandbox Code Playgroud)

c# vb.net database-connection transactions using-statement

9
推荐指数
2
解决办法
1万
查看次数

刷新NHibernate同时仍然允许事务回滚

我试图将NHibernate与未与NHibernate映射的遗留实体一起使用.有时这意味着我需要手动将NHibernate数据刷新到数据库,这样当我尝试将遗留实体与NHibernate映射实体连接时,我不会收到外键异常.

当这发生在需要回滚的事务中时会发生问题.从NHibernate刷新的数据不会回滚.

我能做些什么吗?

UPDATE

仍然很好奇如何做到这一点 - 我不相信给出的任何答案都解决了这个问题.我需要调用Flush().问题是,如何回滚已刷新的数据?

nhibernate transactions flush

5
推荐指数
1
解决办法
5017
查看次数

5
推荐指数
1
解决办法
2010
查看次数

我可以使用DataAdapter C#填充列表吗?

假设我有这个代码(伪代码)

class SomeClass
{
   class Person
   {
      public static string Name { get; set; }
      public static int Age { get; set; }
   }

   List<Person> person = new List<person>;

   public void SelectPerson()
   {
      DataTable dt = new DataTable();

      SqlConnection conn = GetConnection();
      conn.Open();

      SqlDataAdapter da = new SqlDataAdapter("SELECT name, age FROM person", conn);
      da.Fill(dt);
   }
}
Run Code Online (Sandbox Code Playgroud)

我可以根据DataAdapter的结果填写列表(人)吗?我该怎么办?或者有任何解决方法吗?谢谢...

c# ado.net

4
推荐指数
1
解决办法
3万
查看次数

mysql事务(提交和回滚)

下面是我用于MySqlTransaction的代码,它运行得很好....但问题是因为我使用mysql命令的单个实例我必须在其中使用唯一的PARAMETER.这毁了我的查询.有没有其他方法可以做....

我尝试在每次查询后处置cmd但没有用.. :(


          con.Open()
            Dim sqlTran As MySqlTransaction = con.BeginTransaction()
            Dim cmd As MySqlCommand = con.CreateCommand()
            cmd.Transaction = sqlTran
            Dim str As String = Nothing
            Try
                cmd.CommandText = "SELECT myid FROM memaster where    Adate=@adate and ANo=@ano and ASource=@asrc"
                cmd.Parameters.AddWithValue("@adate", txt_bpass_adate.Text)
                cmd.Parameters.AddWithValue("@ano", txt_bpass_af.Text)
                cmd.Parameters.AddWithValue("@asrc", txt_bpass_asource.Text)
                str = cmd.ExecuteScalar()
                'cmd.Dispose()'
                If str Is Nothing Then

                    cmd.CommandText = "Insert into memaster (ADate,ANo,ASource) values (@aDate,@aNo,@aSRC)"
                    cmd.Parameters.AddWithValue("@aDate", txt_bpass_adate.Text)
                    cmd.Parameters.AddWithValue("@aNo", txt_bpass_af.Text)
                    cmd.Parameters.AddWithValue("@aSRC", txt_bpass_asource.Text)

     cmd.ExecuteNonQuery()
    End If
     sqlTran.Commit()

            Catch ex As Exception
                Try
                    sqlTran.Rollback()
                Catch ex1 As …
Run Code Online (Sandbox Code Playgroud)

mysql vb.net

3
推荐指数
1
解决办法
2万
查看次数