我是用数据访问类访问数据库的
下面是其中的一段程序
//
Database db=new Database();// Database是自定义数据访问类
sqlparameter[] sqlpara1={
.............
............
}
db.RunProc("proc1",sqlpara1)//proc1是存储过程名,执行存储过程proc1,即对表1进行插入操作
sqlparameter[] sqlpara2={
.............
............
}
db.RunProc("proc2",sqlpara2)//proc2是存储过程名,执行存储过程proc2,,即对表2进行插入操作可是有时会发生这种情况,当执行存储过程proc1,即对表1进行插入操作后,要执行proc2时,程序突然发生意外,抛出一个异常
这样子就发生了表1有数据,而表2没有数据的情况,请问大家这样子通常是要怎么处理好
有没有办法做到SQL事务那样进行回滚的???
虽然.NET程序中也有事务,但是好像对这样子的访问类起不了作用
下面是其中的一段程序
//
Database db=new Database();// Database是自定义数据访问类
sqlparameter[] sqlpara1={
.............
............
}
db.RunProc("proc1",sqlpara1)//proc1是存储过程名,执行存储过程proc1,即对表1进行插入操作
sqlparameter[] sqlpara2={
.............
............
}
db.RunProc("proc2",sqlpara2)//proc2是存储过程名,执行存储过程proc2,,即对表2进行插入操作可是有时会发生这种情况,当执行存储过程proc1,即对表1进行插入操作后,要执行proc2时,程序突然发生意外,抛出一个异常
这样子就发生了表1有数据,而表2没有数据的情况,请问大家这样子通常是要怎么处理好
有没有办法做到SQL事务那样进行回滚的???
虽然.NET程序中也有事务,但是好像对这样子的访问类起不了作用
解决方案 »
- VS2003 .net1.1 加载flash
- 写一个简单的Ajax通用类,刚写一点出错,帮解决!
- 我现在正在自学asp.net,想问下DataGrid这个控件如何使用它自带的分页功能
- 如何解决asp.net显示mysql数据时,中文数据显示为乱码
- asp.net如何让网页自动发信
- 如何让一个TextBox控件获取焦点?
- 内容隐藏与展示
- [求教]在选定的数据源上未找到名为“bookName”的字段或属性
- 服务器端Codebehind方式时,如何注册前端javascript脚本,用什么对象的方法
- 寻求有关ASP.NET和C#的电子书籍????????
- 请教数据绑定列
- 谁有把HTML 转成 JS 的函数代码???
{
conn.Open();
using (OracleTransaction trans = conn.BeginTransaction())
{
try
{
OracleHelper.ExecuteNonQuery(trans, CommandType.Text, SQL_INSERT_CUSTOMPAGE,parms);
Execute 2...
Execute 3...
Execute 4...
...
trans.Commit();
}
catch
{
trans.Rollback();
throw;
}
}
OracleHelper.CloseConnection(conn);
} OracleHelper, I got it from Microsoft Applicaiton Block : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/daab.aspSorry for English
Dim strSQL As String
Dim Conn As New SqlConnection(m_strConn)
strSQLUpdate = "UPDATE BOMM SET COD_ITEM='" & Trim(CType(e.Item.Cells(1).Controls(0), TextBox).Text) & "'," & _
"COD_PEPN='" & Trim(CType(e.Item.Cells(2).Controls(0), TextBox).Text) & "'," & _
"COD_CUSTOM='" & Trim(CType(e.Item.Cells(3).Controls(0), TextBox).Text) & "'," & _
"COD_NUM='" & Trim(CType(e.Item.Cells(4).Controls(0), TextBox).Text) & "'," & _
"COD_TIME='" & Trim(CType(e.Item.Cells(5).Controls(0), TextBox).Text) & "'," & _
"COD_B='" & Trim(CType(e.Item.Cells(6).Controls(0), TextBox).Text) & "'," & _
"COD_PEP='" & Trim(CType(e.Item.Cells(7).Controls(0), TextBox).Text) & "'," & _
"COD_ENTER='0' WHERE COD_ITEM='" & Trim(TextBox1.Text) & "' AND COD_B='" & Trim(TextBox2.Text) & "'"
Dim Cmd As New SqlCommand Try
Conn.Open()
cmd.Connection = conn
Cmd.Transaction = Conn.BeginTransaction(IsolationLevel.ReadCommitted)
Cmd.CommandText = strSQLUpdate
Cmd.ExecuteNonQuery() TextBox1.Text = Trim(CType(e.Item.Cells(1).Controls(0), TextBox).Text)
TextBox2.Text = Trim(CType(e.Item.Cells(6).Controls(0), TextBox).Text)
With Cmd.Parameters
.Add("@RTIME", SqlDbType.DateTime)
.Add("@COD_ITEM", SqlDbType.NVarChar)
.Add("@COD_B", SqlDbType.NVarChar)
.Add("@COD_PEP", SqlDbType.NVarChar)
.Add("@COD_NUM", SqlDbType.NVarChar)
.Add("@TYPE", SqlDbType.NVarChar)
End With
With Cmd
.Parameters("@RTIME").Value = Now
.Parameters("@COD_ITEM").Value = Trim(TextBox1.Text)
.Parameters("@COD_B").Value = TextBox2.Text
.Parameters("@COD_PEP").Value = CType(Session("UserName"), String).ToString
.Parameters("@COD_NUM").Value = CType(Session("Name"), String).ToString
.Parameters("@TYPE").Value = "修改主表"
End With
Dim strSql_His As String
strSql_His = "INSERT INTO BOMHISTRY(RTIME,COD_ITEM,COD_B,COD_PEP,COD_NUM,TYPE) VALUES(@RTIME,@COD_ITEM,@COD_B,@COD_PEP,@COD_NUM,@TYPE)"
Cmd.CommandText = strSql_His
Cmd.ExecuteNonQuery()
Cmd.Transaction.Commit()
Catch ex As Exception
Try
Cmd.Transaction.Rollback()
Response.Write("<script>javascript:alert('操作失敗,資料更新失敗,已經復原.請再試!!')</script>")
Catch ee As Exception
Response.Write("<script>javascript:alert('操作失敗,請通知管理員!!')</script>")
End Try
Finally
Conn.Close()
Conn.Dispose()
Cmd.Dispose()
End Try
DataGrid1.EditItemIndex = -1
BindData2()
SqlConnection myConnection = new SqlConnection("Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;");
myConnection.Open();
// 启动一个事务
SqlTransaction myTrans = myConnection.BeginTransaction();
// 为事务创建一个命令
SqlCommand myCommand = new SqlCommand();
myCommand.Connection=myConnection;
myCommand.Transaction = myTrans;
try
{
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, "Description")";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, "Description")";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Both records are written to database.");
}
catch(Exception e)
{
myTrans.Rollback();
Console.WriteLine(e.ToString());
Console.WriteLine("Neither record was written to database.");
}
finally
{
myConnection.Close();
}
SqlConnection myConnection=SqlClass.GetConnection();//数据访问类的一个方法,返回一个Connection
// 启动一个事务
SqlTransaction myTrans = myConnection.BeginTransaction();
try
{
String sqlstr="insert into.............";
SqlClass.ExecuteSql(sqlstr1);//SqlClass.ExecuteSql(String sqlstr)是数据访问类的一个方法,能执行sqlstr语句对数据库的操作String sqlstr2="insert into.............";
SqlClass.ExecuteSql(sqlstr2);myTrans.Commit();}
catch(Exception e)
{myTrans.Rollback();
}
finally
{
myConnection.Close();
}
另外,如果数据发生“脏读”会影响数据完整性,也用Transaction来处理。
ado.net给我们提供了强大的数据库访问机制,但是每一次我们访问数据时都比较麻烦,况且我们开发信息系统时需要大量的数据库访问,为此,我做了一个用Ado.net访问数据库的类,可以说是Ado.net的集成及功能的扩展,访问数据只需要一个属性就可以为你返回DataTable数据表了,其中还包括事务处理的概念,可以大大的缩短我们快速编程的时间,由于篇幅的限制,我不能在这里把源代码贴处理,有需要的可以给我email,我发给你们。绝对免费,为了大家互相学习,交流!