这个问题以前有很多人问过,通过DataAdapter直接更新数据库不行,只能分别更新3个表,把他们放在一个事务中。

解决方案 »

  1.   

    我用的数据库是access,请楼上的大侠说清楚一点啊,急啊
      

  2.   

    去我的blog里看看吧!通过扩展的dataset很方便的!blog.csdn.net/xinyulou
      

  3.   

    你现在的问题在哪啊?把datagrid里的三张表的数据分别UPDATE三张表就可以了啊
      

  4.   

    不行啊,因为我的那三张表并不是要显示所有的字段,有些字段不在dataGrid中显示出来,但是在数据库中确实存在
      

  5.   

    xinyulou(心雨楼) 
    你的那篇文章有问题啊,还有,能不能给出你的思路
      

  6.   

    但是我使用的是access数据库,好像不支持视图的哦
      

  7.   

    或者采用循环语句分别对三个表写update或insert.做项目时,一般来说采用这两种方法.
      

  8.   

    我再次回答这个问题,曾经有网友问过类似的问题,并给我500分,结果让版主认为我倒分,把分子都扣掉了。
    整体思路是利用DataAdapter的Updata方法和SqlCommandBuilder类的自动生成语句。 回复人: SimerJoe(浪月) ( ) 信誉:100  2004-6-17 12:51:42  得分: 100  这是一个好问题,我在开发中遇到的时候是这样解决的:
    DataAdapter实例化后始终是一个对象,只要保留了它的引用那么它就跑不了。
    在需要的时候定义一个新的DataAdapter对象,并得到当初那个对象的引用就ok了。
    请看代码:
    internal static string[] TableNameTotal={
    "Employee",
    "IncContact",
    "Linkman",
    "IndividualContact",
    "ConfigureDocument",
    "ServiceAcceptDocument",
    "BizChance",
    "ServiceSort",
    "Ware",
    "ServiceDispatchDocument",
    "BankAccount",
    "ConfigureDocumentDetail",
    "SaleDocument",
    "SaleDocumentDetail",
    "Client"
    };
    //搞一个数组,这里是我数据库的所有表名。
    internal ArrayList Adapters
    {
    get
    {
    SqlConnection myCn = new SqlConnection(strConn);
    ArrayList SqlDataAdapters=new ArrayList(DBOperator.TableNameTotal.Length);
    for(int i=0;i<DBOperator.TableNameTotal.Length;i++)
    {
    string strSQL="select * from "+DBOperator.TableNameTotal[i];
    SqlDataAdapters.Insert(i,new SqlDataAdapter(strSQL,myCn));
    } return SqlDataAdapters;
    }
    }//这里是一个对象列表,大家都可以看到里面放的是什么吧,这里是关键。 internal override DataSet ExecuteTotalData()
    {
    SqlConnection myCn = new SqlConnection(strConn);
    try
    {
    for(int i=0;i<DBOperator.TableNameTotal.Length;i++)
    {
    SqlDataAdapter adapter=(SqlDataAdapter)Adapters[i];
    adapter.Fill(TotalData,DBOperator.TableNameTotal[i]);
    }
    return TotalData;
    }
    catch(System.Data.SqlClient.SqlException e)
    {
    throw new Exception(e.Message);
    }
    finally
    {
    myCn.Close();
    }
    }//这里得到了我需要的DataSet,这可是15个表哦。 internal override bool UpdateDB(DataSet TotalDS)
    {
    SqlConnection myCn = new SqlConnection(strConn);
    try
    {
    for(int i=0;i<DBOperator.TableNameTotal.Length;i++)
    {
    SqlDataAdapter adapter=(SqlDataAdapter)Adapters[i];
    SqlCommandBuilder cb=new SqlCommandBuilder(adapter);
    adapter.Update(TotalDS,TotalDS.Tables[i].TableName);
    }
    return true;
    }
    catch
    {
    return false;
    }
    finally
    {
    myCn.Close();
    }
    }//更新的方法就在这里啦,怎么样,从此高枕无忧。由于这些代码是写在不同的类里面,我又只贴了一些关键部分,所以还希望大家看的时候多多包含。  其实我这些代码还有可以优化的地方。
    总之,得到了DataSet以后在程序里面就可以直接对DataSet进行操作,然后利用Updata方法进行数据库的保存。
    在这里有3个关键的地方,
    1、数组保存了表名以后是存在顺序的,不至于表名混乱。
    2、对象列表是传引用的,不至于对象丢失。
    3、DataAdapter对象是传引用的,不至于对象丢失。
    我就是利用对象并没有被销毁来得到其引用的。 原贴在这里:
    http://community.csdn.net/Expert/topic/3098/3098045.xml?temp=.9816553
      

  9.   

    至于想隐藏表中某些列的话,
    可以用DataGrid的TableStyles属性,参考以下代码:
    internal static DataGridTableStyle getSaleDocumentFromStyls()
    {
    DataGridTableStyle style=new DataGridTableStyle(); style.MappingName="FormWareTable"; DataGridTextBoxColumn serialNumber=new DataGridTextBoxColumn();
    serialNumber.MappingName="serialNumber";
    serialNumber.HeaderText="序号";
    serialNumber.ReadOnly=true;
    serialNumber.Width=30; DataGridTextBoxColumn WareName=new DataGridTextBoxColumn();
    WareName.MappingName="WareName";
    WareName.HeaderText="商品名称及型号";
    WareName.Width=130; DataGridTextBoxColumn Unit=new DataGridTextBoxColumn();
    Unit.MappingName="Unit";
    Unit.HeaderText="单位";
    Unit.Width=50; DataGridTextBoxColumn Number=new DataGridTextBoxColumn();
    Number.MappingName="Number";
    Number.HeaderText="数量"; DataGridTextBoxColumn Prix=new DataGridTextBoxColumn();
    Prix.MappingName="Prix";
    Prix.HeaderText="单价"; DataGridTextBoxColumn Money=new DataGridTextBoxColumn();
    Money.MappingName="Money";
    Money.HeaderText="金额";
    Money.ReadOnly=true;
    Money.Width=100; style.GridColumnStyles.AddRange(new DataGridColumnStyle[]{serialNumber,WareName,Unit,Number,Prix,Money});
    style.HeaderBackColor=Color.White;
    style.RowHeadersVisible=false; return style;
    }DataGrid dg=new DataGrid();
    dg.TableStyless.Add(getSaleDocumentFromStyls);
    如果你想隐藏Money列,那么不写
    Money.MappingName="Money";
    Money.HeaderText="金额";
    Money.ReadOnly=true;
    Money.Width=100;
    就不会出现这列了。
      

  10.   

    关键在于,我的是多表,能用updata吗?
      

  11.   

    datagird和dataset绑定了的三,直接用
    oldbdataadapter就可以了
      

  12.   

    对不起,我昨天没有上班,所以没来这里看。
    让你久等了。这样做的前提是数据库里面的每个表都对应DataSet里面单独的表。
    而且这些表都是由DataAdapter的Fill方法填充的。如果是混合表的话必须写代码将它门拆分,分别添加或修改当前的填充表。
    再利用以上代码更改数据库。其实我自己在工作中就是这样做的。