使用 DataAdapter+DataSet来给多个数据表添加多条数据如何做分布式处理?
BeginTransaction()
希望有详细的解答
---------------------------
出错代码!
---------------------------                        OleDbConnection Dataconn = new OleDbConnection(global::WindowsApplication1.Properties.Settings.Default.nodenetConnectionString.ToString());
                       
                        OleDbTransaction tracsaction = null;                try
                {
                    Dataconn.Open();
                    
                                           tracsaction = Dataconn.BeginTransaction();
                                               OleDbDataAdapter DataAdapterClient = new OleDbDataAdapter("select C_name,C_idNo,C_tel,C_ticketNo,C_ticketPrice,C_fuJia,C_ETNo,ticketID from client where id=0", Dataconn);
                        OleDbCommandBuilder DataBuildClient = new OleDbCommandBuilder(DataAdapterClient);
                        DataSet DataSetClient = new DataSet();
                        DataAdapterClient.Fill(DataSetClient, "client");
                        for (int i = 0; i < ClientInfo.RowCount; i++)
                        {
                            DataRow ThisRowClient = DataSetClient.Tables["client"].NewRow();
                            ThisRowClient["C_name"] = ClientInfo.Rows[i].Cells[1].Value.ToString();
                           ......
                            ThisRowClient["ticketID"] = TicketIdNo;
                            DataSetClient.Tables["client"].Rows.Add(ThisRowClient);                            
                        }
                        
                        DataAdapterClient.Update(DataSetClient, "client");                        
                        OleDbDataAdapter DataAdapterFlightNo = new OleDbDataAdapter("select T_flightNo,T_aircom,T_class,T_code,T_carrier,T_boardPoint,T_offpoint,T_departureDate,T_departureTime,T_arrivalTime,TicketId from flightNo where T_id=0", Dataconn);                        OleDbCommandBuilder DataBuildFlightNo = new OleDbCommandBuilder(DataAdapterFlightNo);
                        DataSet DataSetFlightNo = new DataSet();
                        DataAdapterFlightNo.Fill(DataSetFlightNo, "flightNo");
                        for (int i = 0; i < FlightNo.RowCount; i++)
                        {
                            DataRow ThisRowFlightNo = DataSetFlightNo.Tables["flightNo"].NewRow();
                            ThisRowFlightNo["T_flightNo"] = FlightNo.Rows[i].Cells[1].Value.ToString();
                            ......
                            ThisRowFlightNo["TicketId"] = TicketIdNo;
                            XingChengDui = XingChengDui + FlightNo.Rows[i].Cells[3].Value.ToString() + "-" + FlightNo.Rows[i].Cells[4].Value.ToString() + " ";                            DataSetFlightNo.Tables["flightNo"].Rows.Add(ThisRowFlightNo);
                        }
                        DataAdapterFlightNo.Update(DataSetFlightNo, "flightNo");                        OleDbDataAdapter DataAdapter = new OleDbDataAdapter("select pnr,ChuPiaoYuan,SongPiaoYuan,ShiFouShouKuan,Pnr_bak,TicketId,TianJiaShiJian,XingCheng,SuoShuRen,JieDanYuan,FanDian,TicketType from TicketInfo where id=0", Dataconn);
                        OleDbCommandBuilder DataBuild = new OleDbCommandBuilder(DataAdapter);                        DataSet ThisDataSet = new DataSet();
                        DataAdapter.Fill(ThisDataSet, "TicketInfo");
                        DataRow ThisRow = ThisDataSet.Tables["TicketInfo"].NewRow();
                        ThisRow["pnr"] = this.pnr.Text.ToString();
                        ......
                        ThisRow["TicketType"] = this.ticketType.Text.ToString();
                        ThisDataSet.Tables["TicketInfo"].Rows.Add(ThisRow);
                        DataAdapter.Update(ThisDataSet, "TicketInfo");
                        tracsaction.Commit();
                        PnrInfo.Clear();
                        clearList();
                   
                    }                    //MessageBox.Show(global::WindowsApplication1.Properties.Settings.Default.nodenetConnectionString.ToString());
                }
                catch (Exception ee)
                {
                    tracsaction.Rollback();
                    MessageBox.Show(ee.ToString());
                }
                finally
                {
                    Dataconn.Close();
                }---------------------------
出错信息!
---------------------------
System.InvalidOperationException: 如果分配给命令的连接位于本地挂起事务中,ExecuteReader 要求命令拥有事务。命令的 Transaction 属性尚未初始化。   在 System.Data.OleDb.OleDbConnectionInternal.ValidateTransaction(OleDbTransaction transaction, String method)   在 System.Data.OleDb.OleDbConnection.ValidateTransaction(OleDbTransaction transaction, String method)   在 System.Data.OleDb.OleDbCommand.ValidateConnectionAndTransaction(String method)   在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)   在 System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)   在 System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)   在 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)   在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)   在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable)   在 WindowsApplication1.nodeTi.save_info_Click(Object sender, EventArgs e) 位置 E:\net 开发\ACCESSnodeTicket\WindowsApplication1\Form1.cs:行号 343
---------------------------
确定   
---------------------------

解决方案 »

  1.   

    那么就要一条一条的用command向数据库添加数据了? 感觉这样不妥啊....
      

  2.   

    你把transaction赋给dataadapter的每一个command即可。
      

  3.   

    不是要一条一条的更新啊。是因为你开启了Transaction,所以在实现化OleDbDataAdapter 时,是要用command变量作为参数的重载构造函数,该command就设置Transaction.将你的"select C_name,C_idNo..."语句赋给command.CommandText就可以了。
    其它的用法,就和你的代码一样的。。