问题一:目的是我不知道怎么用C#事务处理机制更新主表与明细表。前提:
数据集,数据适配器是我用拖控件的方式加进程序里面的,不是用DataSet dataSet1 = new DataSet()这样代码的方式。
然后我监控两张表。
cmOrders = (CurrencyManager)BindingContext[dataSet11, 表1];
cmOrders2 = (CurrencyManager)BindingContext[dataSet11, 表2];
接着我加数据
cmOrders.AddNew();
cmOrders2.AddNew();
最后我更新
表1Adapter.Update(dataSet11);
表2Adapter.Update(dataSet11);这两张是主表与明细表,主表的ID在明细里面是外键,而且主明细都在sql server里面设置了ID自增1,所以AddNew();数据的时候不对ID进行添置。现在我就很郁闷了,对我这种情况怎么进行事务处理????//////////////////////////////////////////////////////////////////////////////////////////////////////////////
问题二:
            for (int i = 0; i < stockTableTableAdapter1.GetData(strmaterielName).Rows.Count; i++)
            {   
                //灰色
                if (stockTableTableAdapter1.GetData(strmaterielName).Rows[i].ItemArray[6].ToString().Trim() == "A")
                {
                     //我想取得某个栏位的值等于A以后把datagridView的i行设置为红色,请问怎么做????
                }
            }

解决方案 »

  1.   

    先主表再子表insert select @@identity;
    事务处理 
    using(TransactionScope scope = new TransactionScope())
    {}
    public void SqlTransactioin(string[] sqls)
      {
      using(SqlConnection con = new SqlConnection(""))
      {
      conn.Open();
      SqlCommand comm = conn.CreateCommand();
      SqlTransaction trans = conn.BeginTransaction();
      comm.Transaction = trans;
      try
      {
      foreach (string sql in sqls)
      {
      comm.CommandText = sql;
      comm.ExecuteNonQuery();
      }
      trans.Commit();
      }
      catch (Exception ex)
      {
      trans.Rollback();
      }
      }
      conn.Close();
      }
      

  2.   

    问题二:C# code            for (int i = 0; i < stockTableTableAdapter1.GetData(strmaterielName).Rows.Count; i++)
                {   
                    //灰色
                    if (stockTableTableAdapter1.GetData(strmaterielName).Rows[i].ItemArray[6].ToString().Trim() == "A")
                    {
                         //我想取得某个栏位的值等于A以后把datagridView的i行设置为红色,请问怎么做????
                    }
                }问题2:
    datagridview1.rows[i].backcolor = color.red
      

  3.   

    1、DataSet中,必须对主表和明细表建立关系,这样才可以保证使用DataAdapter执行Insert后,取回的主表ID,可以自动更新到从表ID中2、主表适配器的InsertCommand的SQL要这样写:"INSERT INTO Orders(CustomerID,) VALUES (@CustomerID, ); SELECT OrderID, CustomerID,  FROM Orders WHERE (OrderID = @@IDENTITY)"3,从表适配器的InsertCommand的SQL要这样写:"INSERT INTO [Order Details] (OrderID, ProductID, ) VALUES (@OrderID, @ProductID, ); SELECT OrderID, ProductID, FROM [Order Details] WHERE (OrderID = @OrderID) AND (ProductID =@ProductID)"(OrderID和ProductID,是该表的主键,我举的例子是NorthWind中现成的两个表,你可以参照一下原表)4,先由主表适配器Update(dataSet),执行完闭后,dataSet中会自动更新主表和从表的OrderID的值,再由从表适配器Update(dataSet).以上的关键是,数据集(DataSet)中建立关系两条SQL语句的写法至于启用事务,直接把两个DataAdapter中各Command对象的Transaction指向DBConnection的BeginTransaction()方法返回的对象即可。其实这种方法很麻烦(而且有时设计器也会找麻烦),处理这种主从表的插入问题时,最好直接使用两个DBCommand,而不是DataAdapter
      

  4.   

    private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
      {
      if (e.RowIndex == -1)
      return;  DataGridViewRow dgr = dataGridView1.Rows[e.RowIndex];   
      try
      {
      if(e.ColumnIndex==0)
      {
      if (dgr.Cells["ID"].Value.ToString() == "1002" )
      {   
      e.CellStyle.BackColor = Color.Red;   
      }
      }
      

  5.   

    麻烦,我根据你说的北风数据库的表,自己做了下实验,发现不行。insert语句是数据适配器自动生成的,代码如下INSERT INTO Orders
          (CustomerID, EmployeeID, OrderDate, RequiredDate, ShippedDate, ShipVia, Freight, 
          ShipName, ShipAddress, ShipCity, ShipRegion, ShipPostalCode, ShipCountry)
    VALUES (@CustomerID,@EmployeeID,@OrderDate,@RequiredDate,@ShippedDate,@ShipVia,@Freight,@ShipName,@ShipAddress,@ShipCity,@ShipRegion,@ShipPostalCode,@ShipCountry)
    INSERT INTO [Order Details]
          (OrderID, ProductID, UnitPrice, Quantity, Discount)
    VALUES (@OrderID,@ProductID,@UnitPrice,@Quantity,@Discount)先不说事务处理,就是你说的“4,先由主表适配器Update(dataSet),执行完闭后,dataSet中会自动更新主表和从表的OrderID的值,再由从表适配器Update(dataSet).”这条就不能满足,因为我“更新”数据的时候代码出错,显示明细表的OrderID为空。
    即使我在数据适配器里面"加入查询",得到与你类似的代码INSERT INTO [dbo].[Orders] ([CustomerID], [EmployeeID], [OrderDate], [RequiredDate], [ShippedDate], [ShipVia], [Freight], [ShipName], [ShipAddress], [ShipCity], [ShipRegion], [ShipPostalCode], [ShipCountry]) VALUES (@CustomerID, @EmployeeID, @OrderDate, @RequiredDate, @ShippedDate, @ShipVia, @Freight, @ShipName, @ShipAddress, @ShipCity, @ShipRegion, @ShipPostalCode, @ShipCountry);
    SELECT OrderID, CustomerID, EmployeeID, OrderDate, RequiredDate, ShippedDate, ShipVia, Freight, ShipName, ShipAddress, ShipCity, ShipRegion, ShipPostalCode, ShipCountry FROM Orders WHERE (OrderID = SCOPE_IDENTITY())这样当主表更新,明细的关联ID还是没更新(明细表也有做新的插入方法).
    不明白为什么
    /////////////////////////////////////////////
    后来我用事务处理tableAdapterManager1.Connection.BeginTransaction();发觉只有begintransaction,没有commit与rollback,更不解,请教了我根据的思路,做的北风数据库两张表的测试程序在
    http://download.csdn.net/source/2680558
    这里可以下载。
    麻烦各位帮忙看下,很重要,谢谢各位前辈
      

  6.   

    其实这种方法很麻烦(而且有时设计器也会找麻烦),处理这种主从表的插入问题时,最好直接使用两个DBCommand,而不是DataAdapter上面的话,是我的原话,这两条查询语句,是需要你自己指定的.不要轻意忽略别人的话,哪怕是一个标点符号
      

  7.   

    在DataSet中建立主从表关系时,是可以指定级联更新的,这四个红字不是Ado.Net的术语,是数据库的术语,建立关系时,肯定有这个参数的,如果你在InsertCommand中指定:"INSERT INTO Orders(CustomerID,) VALUES (@CustomerID, ); SELECT OrderID, CustomerID,  FROM Orders WHERE (OrderID = @@IDENTITY)"这种语句的话,DataAdapter会更新你的源DataSet中的行,请注意我的红色的分号,这种语句,会导致在主表Insert后,重新取得插入的ID,同步更新DataSet中的主表和从表,当从表插入时,你就不需要考虑主表ID的问题了
      

  8.   


    最近在忙很多事情,白天上班也不能耽误,所以回复有点迟,对不住。
    你的图我看了,也设置了,不行我根据的思路,做的北风数据库两张表的测试程序在
    http://download.csdn.net/source/2680558
    这里可以下载。这个是我的程式源码,根据你说的弄的,下载不要分的,麻烦你看下,具体分析一下,这样我好死的明白一点,我这种主从关系到底哪里更新有问题??谢谢了,非常感谢
      

  9.   

    看了你的代码了,如下修改:
    1,修改数据集:见下图
    2,修改DataGridView的DataMember:见下图
    3修改Form1代码,如下:
        public partial class Form1 : Form
        {
            private CurrencyManager cmOrders;
            private CurrencyManager cmOrders2;        public Form1()
            {
                InitializeComponent();            cmOrders = (CurrencyManager)BindingContext[dataSet11, "Orders"];
                cmOrders2 = (CurrencyManager)BindingContext[dataSet11, "Orders.FK_Order Details_Orders"];
                cmOrders.AddNew();
                cmOrders.EndCurrentEdit();
            }        private void button1_Click(object sender, EventArgs e)
            {            this.order_DetailsTableAdapter1.Connection = (SqlConnection)tableAdapterManager1.Connection;
                this.ordersTableAdapter1.Connection = (SqlConnection)tableAdapterManager1.Connection;
                tableAdapterManager1.Connection.Open();
                System.Data.SqlClient.SqlTransaction action = (SqlTransaction)tableAdapterManager1.Connection.BeginTransaction();
                try
                {
                    order_DetailsTableAdapter1.Transaction = action;
                    ordersTableAdapter1.Transaction = action;                ordersTableAdapter1.Update(dataSet11);
                    order_DetailsTableAdapter1.Update(dataSet11);                action.Commit();
                }
                catch (System.Exception eUpdate)
                {
                    action.Rollback();
                    MessageBox.Show(eUpdate.Message);
                }
                finally
                {
                    if (tableAdapterManager1.Connection.State != ConnectionState.Closed)
                        tableAdapterManager1.Connection.Close();
                }
            }
        }
      

  10.   


    System.Data.InvalidConstrainException:ForeignKeyConstraint FK_Order_Details_Orders requires the child key values to exist in the parent table.似乎Order Details在更新主表的OrderID不行啊,崩溃了