我狂顶顶顶!我相信一定有解决方法!
我的思路:即然两个表的结构一样,我只要把产生的数据集的ROWS合并到数据库的数据集中,不就行了???实验中......

解决方案 »

  1.   

    即然在内存中的表同数据库中的表的结构是一样,
    按道理直接用DataAdapter.Update就可以了。
    关于DataAdapter的使用参见MSDN。
      

  2.   

    henryfan1:
    这可能吗?适配器的更新是把来自于它的数据源的数据先填充到一个数据集上,然后把数据集的修改反映到数据源上,也就是说,适配器同数据集是有关系的。但是,我现在是程序在运行中动态生成一个数据集,这个数据集的产生同适配器没有任何联系,他的数据并不来自于一个适配器对象,这样可以填充吗?我现在的思路是:首先创建一个适配器,并填充到一个数据集,然后将此数据集的结构复制到一个临时的数据集中,取得临时数据集产生的数据行,然后将行合并到原有的数据集中,然后在更新。
      

  3.   

    动态创建DataAdapter,(创建完后还是不能用的)
    创建SQLBuilder对象填充DataAdapter....(其实.。嘿
    填写表映射数据库表和数据集的映射关系
    。。
    就这样
      

  4.   

    SqlCommandBiulder cb=new SqlCommandBiulder(da)//这句不要忘了
    da.UpDate(ds);
      

  5.   

    舍得:
    那么da要不要指定select字符串,如:
    SqlDataAdapter da =new SqlDataAdapter("select * from table",newconn);
      

  6.   

    首先你要一个SELECTCOMMAND,
    通过SELECTCOMMAND来构造SqlDataAdapter
    然后再生成对应的SqlCommandBuilder
    不过可以手动生成对应的UPDATE的SQL语句也可以,有点杂习(。NET数据服务C#高级编程有提及)
      

  7.   

    private void btnUpdate_Click(object sender, System.EventArgs e)
    {
        DataRow targetRow = dataTable.Rows[lbCustomers.SelectedIndex];
        lblMessage.Text = "Updating " + targetRow["CompanyName"];
        Application.DoEvents();
       
        targetRow.BeginEdit();
        targetRow["CompanyName"] = txtCompanyName.Text;
        targetRow.EndEdit();    DataSet DataSetChanged = DataSet.GetChanges(DataRowState.Modified);
        bool okayFlag = true;    if (DataSetChanged.HasErrors)
        { okayFlag = false;
    string msg = "Error in row with customer ID";
    foreach( DataTable theTable in DataSetChanged.Tables)
    {
               if (theTable.HasErrors)
    {
               DataRow[] errorRows = theTable.GetErrors(); foreach(DataRow theRow in errorRows)
    {
    msg = msg + theRow["CustomerID"]; }
    }
             }
    lblMessage.Text = msg;
    }
    //如无错
    if (okayFlag)
    {
    //合并
    DataSet.Merge(DataSetChanged); //更新数据库**************************
    DataAdapter.Update(DataSet,"Customers");  //执行这一句出现如下信
    息。
    //***********************************************
    //通知用户
    lblMessage.Text = DataAdapter.UpdateCommand.CommandText;
    Application.DoEvents();
    DataSet.AcceptChanges();
    PopulateLB();
           }
           else
    DataSet.RejectChanges();

    }
    ===================================未处理的“System.InvalidOperationException”类型的异常出现在 system.data.dll 中其他信息:当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand。
      

  8.   

    建立适配器SqlDataAdapter sda =new SqlDataAdapter(("select * from table",newconn);
    分别建立SqlCommand 实现插入删除修改数据库数据的功能
    比如建立一个删除数据库数据的command 
    SqlCommand  sqlInser = new SqlCommand ();
    sqlInsert.CommandText = "delete from table where primekey = @key";
    然后添加参数@key
    最后建立数据适配器与dataset之间的数据映射关系
    添加表之间的映射关系
    sda.TableMappins.add(sourceTabel,DatasetTable);
    添加列之间的数据映射关系
    this.sqlDataAdapter1.TableMappings[0].ColumnMappings.Add();
      

  9.   

    SqlCommandBiulder cb=new SqlCommandBiulder(da)//
    加上没有?
      

  10.   

    我都糊涂了,我把我的真正意图告诉大家吧:我有一个资料输入窗口,客户要求批量输入,就是一次性会输入大量的数据,但是客户要求不使用象DATAGRID这种表格式的输入。
    因为客户一次性会输入多条数据,并且输入完以后还要进行编辑修改确认无误后才保存,所以需要方便的向前向后进行数据操作,所以我想所有的文本框绑定到数据集,利用其this.BindingContext[dataset1,"table"].Position就可以了。本来问题很简单就可以解决,但是客户的资料是非常庞大的,我不可能在一个仅仅实现资料输入功能的窗口中利用下面的代码进行绑定:
    myadapter=new SqlDataAdapter("select * from table",myconn);
    mybuilder=new SqlCommandBuilder(this.myadapter);
    dataset1=new DataSet();
    myadapter.fill(dataset1);//简单表示
    我不可能绑定dataset1啊??我启动窗体岂不要等N久?况且,窗口出现后,总会显示数据集中的一条数据,总不太好吧?
    所以,我想,当客户输入时,不管他输入多少,临时生成一个数据集(当然里面表的结构同数据库中表的结构是一样的),然后把这个数据集中的数据存在数据库中。这就避免了操作大量数据而影响程序速度的问题。
    大家看看,有什么意见说说
      

  11.   

    用dataset 取结构用 select * from ? where 0<>0 
    批量输入写入dataset 可以用sql 语句任意处理,最后更新
      

  12.   

    jn_sly:
    可否说得详细点,我第一次用SQL啊,手头上又没有资料,或者发点资料给我好吗
      

  13.   

    jn_sly(孤舟) 的方法是可以
    你用一个查不出数据的语句
    然后你可以随便搞,
    最后更新,
    当然 数据库会理解为INSERT
    当然约束要控制好
      

  14.   

    SqlDataAdapter sda =new SqlDataAdapter(("select * from table",newconn);
    修改为SqlDataAdapter sda =new SqlDataAdapter(("select * from table where ....",newconn);
    where 条件你可以自己选择一个合适的,比如最大的那个记录等等
    总之不要把所有的记录都选择出来吧
      

  15.   

    select * from pubs..jobs where 0<>0 取得jobs 的结构放到dataset 中,如果修改可以用
    sql 处理
      

  16.   

    当然可以用数组了存在一个控件中(listview)一样可以处理,也很简单,只要你的结构不变,方法很多
      

  17.   

    终于解决了,先谢谢以上各位发的贴。
    我的方法是这样的:
    1、生成一个临时数据集,克隆用适配器填充的数据集的数据结构
    2、窗体控件绑定临时数据集
    3、直接用适配器更新临数据集。henryfan1(henry)说:
    即然在内存中的表同数据库中的表的结构是一样,
    按道理直接用DataAdapter.Update就可以了。其实,henryfan1一早就说对了,直接更新临时数据集就行了,跟其数据来源是否来自于适配器一点关系都没有。唉,走了不少弯路,晕,呵呵,再次感谢各位。过一会就结贴