[英]How do I do many SQL queries as transactions?
我一直在做在学校的数据库中执行DELETE , UPDATE , INSERT , 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查询,或者没有人执行。 我想知道如何做到这一点,这真的很有帮助。
谢谢!
您的老师指的是交易。 大多数关系数据库都支持事务,包括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的可以支持交易,但MyISAM 不 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.