更新/插入数据库时​​的最佳做法

时间:2014-06-14 03:02:14

标签: c# mysql sql

我正在使用以下类来处理数据库事务,但问题是当我的客户端出现错误的数据库更新时,我无法将数据库回滚到旧的状态,一切都很好。那么有没有最佳实践来实现这一目标。

public class DBConnection
    {
        static SqlConnection connection;

        public void getConnection() {

            try {
                connection = new SqlConnection("Data Source=PC-DILUKSHAN\\SQLEXPRESS;Initial Catalog=EMS;User ID=user;Password=1234");
                connection.Open();

            }catch(Exception e){

                throw e;
            }

        }
        public DataTable executeSelectQuery(String sql) {

            try
            {
                SqlCommand cmd = new SqlCommand(sql, connection);
                cmd.CommandType = CommandType.Text;
                // Create a DataAdapter to run the command and fill the DataTable
                SqlDataAdapter da = new SqlDataAdapter();
                da.SelectCommand = cmd;
                DataTable dt = new DataTable();
                da.Fill(dt);

                return dt;

            }
            catch (Exception e)
            {

                throw e;
            }
            finally {

              connection.Close();
            }

        }

        public void executeUpdateQuery(String sql) {

            try {
                SqlCommand cmd = new SqlCommand(sql, connection);
                cmd.ExecuteNonQuery();

            }catch(Exception e){

                throw e;
            }
            finally
            {
                connection.Close();

            }

        }

    }

1 个答案:

答案 0 :(得分:1)

使用SqlTransaction对象。 Here是有关如何回滚事务的示例:

private static void ExecuteSqlTransaction(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        SqlCommand command = connection.CreateCommand();
        SqlTransaction transaction;

        // Start a local transaction.
        transaction = connection.BeginTransaction("SampleTransaction");

        // Must assign both transaction object and connection 
        // to Command object for a pending local transaction
        command.Connection = connection;
        command.Transaction = transaction;

        try
        {
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
            command.ExecuteNonQuery();
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
            command.ExecuteNonQuery();

            // Attempt to commit the transaction.
            transaction.Commit();
            Console.WriteLine("Both records are written to database.");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
            Console.WriteLine("  Message: {0}", ex.Message);

            // Attempt to roll back the transaction. 
            try
            {
                transaction.Rollback();
            }
            catch (Exception ex2)
            {
                // This catch block will handle any errors that may have occurred 
                // on the server that would cause the rollback to fail, such as 
                // a closed connection.
                Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
                Console.WriteLine("  Message: {0}", ex2.Message);
            }
        }
    }
}