|
.Close();
???? }
}
结合上面的两个方法我们可想到调用Web Service有更合理的方法来完成。
(3)使用事务
public void UpdateCustomerOrdersWithTransaction(DataSet ds)
{
???? SqlTransaction trans = null;
???? try
???? {???
???????? _conn.Open();
???????? trans = _conn.BeginTransaction();
???????? _customerDataAdapter.DeleteCommand.Transaction = trans;
???????? _customerDataAdapter.InsertCommand.Transaction = trans;
???????? _customerDataAdapter.UpdateCommand.Transaction = trans;
???????? _orderDataAdapter.DeleteCommand.Transaction = trans;
???????? _orderDataAdapter.InsertCommand.Transaction = trans;
???????? _orderDataAdapter.UpdateCommand.Transaction = trans;
???? _customerDataAdapter.Update(ds.Tables["Customers"].Select("","",DataViewRowState.Added));
?????????????????? _orderDataAdapter.Update(ds.Tables["Orders"].Select("","",DataViewRowState.Added));
???? _customerDataAdapter.Update(ds.Tables["Customers"].Select("","",DataViewRowState.ModifiedCurrent));
???? _orderDataAdapter.Update(ds.Tables["Orders"].Select("","",DataViewRowState.ModifiedCurrent));
???? _orderDataAdapter.Update(ds.Tables["Orders"].Select("","",DataViewRowState.Deleted));
???? _customerDataAdapter.Update(ds.Tables["Customers"].Select("","",DataViewRowState.Deleted));?
???? ???? trans.Commit();
???? }
???? catch(Exception ex)
???? {
???????? trans.Rollback();
???????? throw new Exception("更新数据出错",ex);
???? }
???? finally
???? {
???????? if(_conn.State != ConnectionState.Closed)
????????????? _conn.Close();
???? }
}
最后让我们来看看窗体的按钮更新事件的代码:
private void buttonUpdate_Click(object sender, System.EventArgs e)
{
????????????? //提交编辑数据
???? this.BindingContext[this._ds].EndCurrentEdit();
????
???? if(radioButtonRef.Checked == true)//引用方式更新
???????? _dataAccess.UpdateCustomerOrders((DataSet)_ds);
???? else if(radioButtonTrans.Checked == true)//启用事务更新数据表
???????? _dataAccess.UpdateCustomerOrdersWithTransaction((DataSet)_ds);
???? else
???? {
???????? DatasetOrders changedData =? (DatasetOrders)_ds.GetChanges();
???????? if(radioButtonWeb.Checked == true)//Web服务的更正更新
???????? {?????????????????????
????????????? _dataAccess.UpdateCustomerOrders((DataSet)changedData);
???????? }
???????? else//创建副本合并方式更新
???????? {?????????????????
????????????? _dataAccess.UpdateCustomerOrders(changedData);
???????? }
???????? //去除订单表中添加的虚拟行
???????? foreach(DataRow row in _ds.Orders.Select("","",DataViewRowState.Added))
????????????? _ds.Orders.RemoveOrdersRow((DatasetOrders.OrdersRow)row);
???????? //去除客户表中添加的虚拟行
???????? foreach(DataRow row in _ds.Customers.Select("","",DataViewRowState.Added))
????????????? _ds.Customers.RemoveCustomersRow((DatasetOrders.CustomersRow)row);
上一页 [1] [2] [3] [4] 下一页 [C语言系列]NET 中C#的switch语句的语法 [系统软件]托拽Explore中的文件到VB.net的窗口 [系统软件]Boost库在XP+Visual C++.net中的安装 [常用软件]新配色面板:Paint.Net3.0RC1官方下载 [常用软件]用内建的“Net Meeting”聊天 [VB.NET程序]Henry的VB.NET之旅(三)—共享成员 [VB.NET程序]Henry的VB.NET之旅(二)—构造与析构 [VB.NET程序]Henry的VB.NET之旅(一)—失踪的窗体 [VB.NET程序]在托盘上显示Balloon Tooltip(VB.NET) [VB.NET程序]Henry手记-VB.NET中动态加载Treeview节点(二)
|