如何将许多SQL查询作为事务执行?

时间:2015-06-06 18:32:48

标签: c# mysql sql oledbcommand

我一直在做代码 DELETE 更新 INSERT <学校数据库中的/ em> SELECT 。问题是它可以同时执行一个查询。像这样:

OleDbConnection con = DAL.GetConnection();
con.Open();

if (con.State == ConnectionState.Open) //si la conexion esta abierta...
{
    string sql = string.Format(" INSERT INTO lol (...)");
    //----->I shortened this above because it's not important <-----
    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = con;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = sql;
    int num = cmd.ExecuteNonQuery();
    con.Close();

    if (num == 0)
    {
         Response.Redirect("register.aspx?err=Error");
    }
    else
    {
         Session["id"] = MyDB.GetUserId(uname);
         Response.Redirect("home.aspx");
    }
}

一旦我的老师告诉我有一些东西,就像这样:你做所有的SQL查询,或者没有人。我想知道如何做到这一点,这将是非常有帮助的。

谢谢!

1 个答案:

答案 0 :(得分:1)

您的老师指的是交易。大多数关系数据库都支持事务,包括MySQL *。事务允许多个CRUD操作的原子行为。这意味着如果一个操作失败,数据库将回滚所做的任何更改,就像没有发生任何操作一样。

请注意,它们同时运行顺序。但是,由于它们是原子的,因此感觉与在一次操作中运行所有内容类似。

为了使用C#使用OleDbConnection类运行事务,您可以从连接对象创建一个事务,假设它已打开。请记住,与存储过程不同,您需要手动提交或回滚事务。

提交事务会使该组操作对数据库“永久”。提交后无法回滚。

回滚是指将数据库重置为开始事务之前存在的状态。

下面是一个从OleDbConnection对象创建事务以及执行提交的示例以及您可能想要回滚的两种情况:

using(OleDbConnection con = DAL.GetConnection())
{
    OleDbTransaction transaction = null;
    try
    {
        con.Open();
        transaction = con.BeginTransaction()

        string queryString1 = //SQL string
        OleDbCommand cmd1 = new OleDbCommand();
        {
            Connection = con,
            CommandType = CommandType.Text,
            CommandText = queryString1
        };

        string queryString2 = //SQL string
        OleDbCommand cmd2 = new OleDbCommand();
        {
            Connection = con,
            CommandType = CommandType.Text,
            CommandText = queryString2
        };

        int num1 = cmd.ExecuteNonQuery();
        int num2 = cmd.ExecuteNonQuery();

        if (num1 == 0 || num2 == 0)
        {
            //We didn't expect something to return 0, lets roll back
            transaction.Rollback();
            //send error message
            Response.Redirect("register.aspx?err=Error");
        }
        else
        {
             //everything seems good, lets commit the transaction!
             transaction.Commit();
             Session["id"] = MyDB.GetUserId(uname);
             Response.Redirect("home.aspx");
        }
    }
    catch(OleDbException ex)
    {
         try
         {
             //something bad happened, lets roll everything back
             transaction.Rollback();
             Response.Redirect("register.aspx?err=Error");
         }
         catch
         {
             //we don't really care about this catch statement
         }
    }
}

以下是关于OleDbConnection.BeginTransaction方法的MSDN文章,其中包含与我上面发布的类似的通用示例。

编辑
*正如@ Clockwork-Muse在评论中所指出的,MySQL支持事务的能力取决于所使用的底层引擎。有许多MySQL引擎,但两个主要的是InnoDB和MyISAM。 InnoDB CAN 支持交易,但MyISAM NOT