我一直在做代码 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查询,或者没有人。我想知道如何做到这一点,这将是非常有帮助的。
谢谢!的
答案 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 。