【问题标题】:How to use DataAdapter with SqlTransaction in C#?如何在 C# 中将 DataAdapter 与 SqlTransaction 一起使用?
【发布时间】:2013-05-10 20:18:28
【问题描述】:

我需要创建 2 个按钮,一个用于启动事务 (startButton),另一个用于提交事务 (commitButton)。

我在尝试为 SELECT 命令实现它时遇到了困难。

当我按下commitButton 时,我收到事务已完成且不再可用的错误。

public void startTransaction(IsolationLevel isolationLevel) {
    connectSQL();
    connection.Open();
    transaction = connection.BeginTransaction(isolationLevel);
    Console.WriteLine("Transaction started !");
}

public void commitTransaction() {
    this.transaction.Commit();
    connection.Close();
    Console.WriteLine("Transaction commited !");
}

public DataTable readAllRezervari() {
    try {
        String selectSql = "SELECT * FROM Rezervari;";
        SqlCommand sqlCommand = new SqlCommand(selectSql, connection, transaction);
        rezervariDataAdapter.SelectCommand = sqlCommand;
        rezervariDataAdapter.Fill(rezervariDataSet, "Rezervari");
    }
    catch (Exception e) {
        Console.WriteLine("ERROR: " + e);
        try {
            transaction.Rollback();
        }
        catch (Exception e2) {
            Console.WriteLine("ERROR: " + e2);
        }
    }
    finally {
        connection.Close();
    }
    rezervariDataTable = rezervariDataSet.Tables["Rezervari"];
    return rezervariDataTable;
}

【问题讨论】:

  • 我认为这种方式无法实现,需要临时存储数据,只在SAVE方式中使用事务。
  • 可能是连接超时了。
  • 关于如何将选择命令的事务拆分为 2 部分(startTransaction、commitTransaction)的任何其他解决方案?没有数据适配器
  • 这可能在 Windows 应用程序中有效,但如果您在 asp.net 网页上使用它,我非常怀疑这是否有效。

标签: c# .net sql sql-server transactions


【解决方案1】:
using (SqlConnection cn = new SqlConnection(ConnectionString.GetConnection()))         
{             
    cn.Open();
    SqlTransaction transction = cn.BeginTransaction();
    SqlDataAdapter sda= new SqlDataAdapter("Select * From TableName", cn);
    sda.SelectCommand.Transaction = transction; 
    sda.Fill(ds, "TableName");
    transction.Commit();                 
}

【讨论】:

    【解决方案2】:

    您似乎正在尝试使用事务提交和回滚作为用户提交或回滚更改的一种方式。我一直认为,如果代码或数据出现问题,您可以防止部分提交的多项更改导致错误数据。我真的比 c# 更了解 vb.net,所以如果我的格式关闭,请原谅我。

    这里有一个想法:将他们所有的数据提交到一个数据表中,并将其存储在一个会话变量或视图状态中

    类似

     rezervariDataTable  = session("reservari");
    

    如果用户点击提交按钮:它会执行将事务写入数据库的代码。

    如果用户点击回滚:

         reservariDataTable = Nothing;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2021-12-16
      相关资源
      最近更新 更多