none
请教关于用数据集来追加另一个数据库中的表数据。 RRS feed

  • 问题

  •  

     
    最终是这样解决的,请大家指教。看看还有没有其他更好的解决办法。
     
    Code Snippet

    DataSet ds = new DataSet();

     

    string strSql = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=a.dat;Persist Security Info=True;Jet OLEDB:Database Password=";

     

    OleDbConnection OleDbConn1=new OleDbConnection(strSql);
    OleDbDataAdapter OleDbAdapter1 = new OleDbDataAdapter();
    OleDbAdapter1.SelectCommand = new OleDbCommand("select * from Table1");
    OleDbAdapter1.Fill(ds, "Table1");

     

    string strSql = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=b.dat;Persist Security Info=True;Jet OLEDB:Database Password=";

     

    OleDbConnection OleDbConn2=new OleDbConnection(strSql);
    OleDbDataAdapter OleDbAdapter2 = new OleDbDataAdapter();
    OleDbAdapter2.SelectCommand = new OleDbCommand("select * from Table1");
    OleDbCommandBuilder OleDbCB = new OleDbCommandBuilder(OleDbAdapter2);

    OleDbAdapter2.UpdateCommand = OleDbCB.GetUpdateCommand();

    OleDbAdapter2.Fill(ds "Table2");

     

    DataTableReader dtr = Ds.Tables["Table1"].CreateDataReader();
    Ds.Tables["Table2"].Load(dtr, LoadOption.Upsert);

     

    OleDbAdapter2.Update(Ds.Tables["Table2"]);

     

    dtr.Close();
    OleDbAdapter1.Dispose();
    OleDbAdapter2.Dispose();
    dtr.Dispose();
    OleDbConn1.Close();
    OleDbConn2.Close();

     

     

     

     

    请问这样写代码能不能实现,用Access数据库a的数据表追加到数据库b中同名数据表中呢?

    能不能将a库中的所有数据表一并加入到数据集A中,并一并追加到数据库B中呢?或追加到数据集B中,再更新数据库B。

    以达到将数据库a的数据追加到数据库b中。

     

    (这个问题属于C#呢?还是数据库问题呢?)

    2008年12月22日 14:46

答案

  • 你好!
             这句去掉:ds2.Table["Table1"].AcceptChanges();不然不会更新数据库的。
        然后加上OleDbDataAdapter1.Update(ds1);来更新数据库。
        你试一下,如果有问题,我们再讨论!
    2008年12月22日 15:30
    版主
  • Code Snippet

    DataSet ds1 = new DataSet();
    DataSet ds2 = new DataSet();
    string strSql1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=a.dat;Persist Security Info=True;Jet OLEDB:Database Password=";

     

    OleDbConnection OleDbConn1=new OleDbConnection(strSql);
    OleDbDataAdapter OleDbAdapter1 = new OleDbDataAdapter();
    OleDbAdapter.SelectCommand = new OleDbCommand("select * from Table1");
    OleDbCommandBuilder OleDbCB1 = new OleDbCommandBuilder(OleDbAdapter1);
    OleDbAdapter.Fill(ds1, "Table1");

    string strSql2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=b.dat;Persist Security Info=True;Jet OLEDB:Database Password=";

    OleDbConnection OleDbConn2=new OleDbConnection(strSql);
    OleDbDataAdapter OleDbAdapter2 = new OleDbDataAdapter(OleDbConn2);

     

    //加入updatecommand

     

    Data.OleDb.OleDbCommandBuilder cb =newData.OleDb.OleDbCommandBuilder (OleDbAdapter2 );

    cb.getinsertCommand();

    //合并数据  被合并的新行被标记为 inserted

    ds2.merge(ds1)

     

    OleDbAdapter2 .update(ds2)   //运行了更新ds2的新行的insertcommand

     

     

    2008年12月23日 4:10
  • DataSet.Tables是只读属性,不能赋值。
    当将新的源 DataSet 合并到目标中时,DataRowState 值为 UnchangedModifiedDeleted 的任何源行都会与具有同一主键值的目标行相匹配。DataRowState 值为 Added 的源行将匹配主键值与新源行相同的新目标行。
    2008年12月23日 4:40
    版主
  •  NetAD 写:

     

    要是用merge合并DataTable1、DataTable2,我就只要建立一个DataSet就可以拉。那两个表用合并,谁在前面,谁追加在谁的后面呢?还有那个UpdateCommand是要写好表内每个字段的更新和添加对应的参数集合,是这样吧?可我不太回写添加的参数集合。

     

    1  

     ds2.merge ds1  结果是 所有ds1 的行被合并到ds2 并且全部标记为 新行added/inserted

    这个和你的目标数据库无关   你用哪个dataadepter更新 就保存到哪个

     

     

    2

    Data.OleDb.OleDbCommandBuilder cb =newData.OleDb.OleDbCommandBuilder (OleDbAdapter2 );

    cb.getinsertCommand();

     

     

    这两句已经根据你的select 自动生成了insert参数集合 

    2008年12月23日 6:18
  •  NetAD 写:
     韦恩卑鄙 写:

    那就是你的 insert 语句问题了

     

    需要的话我再给你写个例子?

     

    那就太感谢了。

    那个getinsert()不就能自动生成么?怎么还要自己添加insert语句呢?

    不用OleDbDataAdapter.update(ds.Tables["Table1"]),用OleDbDataAdapter.insert(ds.Tables["Table1"])这个可以添加近来吗?

     

    或者直接用OleDbDataAdapter.insert(ds.Tables["Table1"]),不用合并的命令了,这样也可以吗?

     

    那就需要把所有的ds.Tables["Table1"]的行都标记为新增行

     

     

    foreach ( Datarow r  in ds.Tables[“Table1”].rows )

    {

    r.RowState = DataRowState.Added;

     

    }

    OleDbDataAdapter.insert(ds.Tables["Table1"])

     

     

     

    2008年12月24日 2:05
  • 我上面不是说了吗,你用Merge用的方式有问题,你了解一下MSDN中的解释就明白了,你需要改变行状态,然后在Merge。
    不需要AcceptChanges了,不然有不能更新了!
    2008年12月24日 2:52
    版主
  • 我最终看到数据库中的变化使用的下面语句

     

    Code Snippet

                DataTableReader r = Table1.CreateDataReader();
                Table2.Load(r, LoadOption.Upsert);

      OleDbAdapter2.Update(Table2);

     

     

    请问高手们,这样问什么就能写入数据库,而用合并区不能写回去呢?
    2008年12月24日 5:13

全部回复

  • 你好!
             这句去掉:ds2.Table["Table1"].AcceptChanges();不然不会更新数据库的。
        然后加上OleDbDataAdapter1.Update(ds1);来更新数据库。
        你试一下,如果有问题,我们再讨论!
    2008年12月22日 15:30
    版主
  •  

    这样不行

    ds2.Table["Table1"]=ds1.Table["Table1"]这时报错,不能负值。

    要是用行追加行不行?表怎么能转到DataRow上来呢?能不能直接将表追加到另一个表的尾部呢?

    2008年12月23日 3:23
  • 检查一下你的两个表结构是否完全一样
    2008年12月23日 3:54
    版主
  • 表结构是一样的,报的是ds2.Tables["Table"]是只读属性不能负值。

     

     

    2008年12月23日 4:05
  • Code Snippet

    DataSet ds1 = new DataSet();
    DataSet ds2 = new DataSet();
    string strSql1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=a.dat;Persist Security Info=True;Jet OLEDB:Database Password=";

     

    OleDbConnection OleDbConn1=new OleDbConnection(strSql);
    OleDbDataAdapter OleDbAdapter1 = new OleDbDataAdapter();
    OleDbAdapter.SelectCommand = new OleDbCommand("select * from Table1");
    OleDbCommandBuilder OleDbCB1 = new OleDbCommandBuilder(OleDbAdapter1);
    OleDbAdapter.Fill(ds1, "Table1");

    string strSql2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=b.dat;Persist Security Info=True;Jet OLEDB:Database Password=";

    OleDbConnection OleDbConn2=new OleDbConnection(strSql);
    OleDbDataAdapter OleDbAdapter2 = new OleDbDataAdapter(OleDbConn2);

     

    //加入updatecommand

     

    Data.OleDb.OleDbCommandBuilder cb =newData.OleDb.OleDbCommandBuilder (OleDbAdapter2 );

    cb.getinsertCommand();

    //合并数据  被合并的新行被标记为 inserted

    ds2.merge(ds1)

     

    OleDbAdapter2 .update(ds2)   //运行了更新ds2的新行的insertcommand

     

     

    2008年12月23日 4:10
  •  

    要是用merge合并DataTable1、DataTable2,我就只要建立一个DataSet就可以拉。那两个表用合并,谁在前面,谁追加在谁的后面呢?还有那个UpdateCommand是要写好表内每个字段的更新和添加对应的参数集合,是这样吧?可我不太回写添加的参数集合。
    2008年12月23日 4:25
  • DataSet.Tables是只读属性,不能赋值。
    当将新的源 DataSet 合并到目标中时,DataRowState 值为 UnchangedModifiedDeleted 的任何源行都会与具有同一主键值的目标行相匹配。DataRowState 值为 Added 的源行将匹配主键值与新源行相同的新目标行。
    2008年12月23日 4:40
    版主
  •  NetAD 写:

     

    要是用merge合并DataTable1、DataTable2,我就只要建立一个DataSet就可以拉。那两个表用合并,谁在前面,谁追加在谁的后面呢?还有那个UpdateCommand是要写好表内每个字段的更新和添加对应的参数集合,是这样吧?可我不太回写添加的参数集合。

     

    1  

     ds2.merge ds1  结果是 所有ds1 的行被合并到ds2 并且全部标记为 新行added/inserted

    这个和你的目标数据库无关   你用哪个dataadepter更新 就保存到哪个

     

     

    2

    Data.OleDb.OleDbCommandBuilder cb =newData.OleDb.OleDbCommandBuilder (OleDbAdapter2 );

    cb.getinsertCommand();

     

     

    这两句已经根据你的select 自动生成了insert参数集合 

    2008年12月23日 6:18
  • 不用再写参数集合那就太好啦。

    那insertCommand和updatecommand不用再写语句了吗?

    我马上去试一试。

    我考虑这上面写的是数据集合并,能不能用数据表DataTable.merge(table2,false)来合并表,然后更新回数据库中呢?

    2008年12月23日 6:25
  •  韦恩卑鄙 写:

    Code Snippet

    DataSet ds1 = new DataSet();
    DataSet ds2 = new DataSet();
    string strSql1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=a.dat;Persist Security Info=True;Jet OLEDB:Database Password=";

     

    OleDbConnection OleDbConn1=new OleDbConnection(strSql);
    OleDbDataAdapter OleDbAdapter1 = new OleDbDataAdapter();
    OleDbAdapter.SelectCommand = new OleDbCommand("select * from Table1");
    OleDbCommandBuilder OleDbCB1 = new OleDbCommandBuilder(OleDbAdapter1);
    OleDbAdapter.Fill(ds1, "Table1");

    string strSql2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=b.dat;Persist Security Info=True;Jet OLEDB:Database Password=";

    OleDbConnection OleDbConn2=new OleDbConnection(strSql);
    OleDbDataAdapter OleDbAdapter2 = new OleDbDataAdapter(OleDbConn2);

     

    //加入updatecommand

     

    Data.OleDb.OleDbCommandBuilder cb =newData.OleDb.OleDbCommandBuilder (OleDbAdapter2 );

    cb.getinsertCommand();

    //合并数据  被合并的新行被标记为 inserted

    ds2.merge(ds1)

     

    OleDbAdapter2 .update(ds2)   //运行了更新ds2的新行的insertcommand

     

     

    我用的是一个数据集,两张表合并的方法。我想应该和上述方法一致。

    请问我这么做后,数据库B.dat中的表Table1没有变化

    2008年12月23日 9:32
  •  韦恩卑鄙 写:

    Code Snippet

    DataSet ds1 = new DataSet();
    DataSet ds2 = new DataSet();
    string strSql1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=a.dat;Persist Security Info=True;Jet OLEDB:Database Password=";

     

    OleDbConnection OleDbConn1=new OleDbConnection(strSql);
    OleDbDataAdapter OleDbAdapter1 = new OleDbDataAdapter();
    OleDbAdapter.SelectCommand = new OleDbCommand("select * from Table1");
    OleDbCommandBuilder OleDbCB1 = new OleDbCommandBuilder(OleDbAdapter1);
    OleDbAdapter.Fill(ds1, "Table1");

    string strSql2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=b.dat;Persist Security Info=True;Jet OLEDB:Database Password=";

    OleDbConnection OleDbConn2=new OleDbConnection(strSql);
    OleDbDataAdapter OleDbAdapter2 = new OleDbDataAdapter(OleDbConn2);

     

    //加入updatecommand

     

    Data.OleDb.OleDbCommandBuilder cb =newData.OleDb.OleDbCommandBuilder (OleDbAdapter2 );

    cb.getinsertCommand();

    //合并数据  被合并的新行被标记为 inserted

    ds2.merge(ds1)

     

    OleDbAdapter2 .update(ds2)   //运行了更新ds2的新行的insertcommand

     

     

    我用的是一个数据集,两张表合并的方法。我想应该和上述方法一致。

    请问我这么做后,数据库B.dat中的表Table1没有变化

    2008年12月23日 9:32
  •  

    怎么还是写不回去数据的?
    2008年12月23日 10:22
  • 你看了我上面关于这个方法的解释了吗?
    另外,你是合并后你是怎样更新回数据库的?
    2008年12月23日 13:06
    版主
  •  

    看了,没用那个提交命令,就是合并后用UPDATE更新回写到数据库中的,可是不报错,也没有追加进取数据的。

     

    我是这样写的

     

    Code Snippet

    将A库中的Table1中的数据,添加到B库中Table1中数据的尾部。           
    DataSet ds = new DataSet();
               
                //原数据集
                string strSql = "Provider=Microsoft.Jet.OLEDB.4.0;Data

    Source=a.dat;Persist Security Info=True;Jet OLEDB:Database

    Password=";
                OleDbConnection OleDbConns = new OleDbConnection

    (strSql);
                OleDbConn1.Open();
                OleDbDataAdapter OleDbAdapter1 = new OleDbDataAdapter

    ("select * from Table1", OleDbConn1);
               
                OleDbAdapters.Fill(ds, "Table1_add");

                //目标数据集
                strSql = "Provider=Microsoft.Jet.OLEDB.4.0;Data

    Source=B.dat";Persist Security Info=True;Jet OLEDB:Database

    Password=";
                OleDbConnection OleDbConn2 = new OleDbConnection

    (strSql);
                OleDbConn2.Open();
                OleDbDataAdapter OleDbAdapter2 = new OleDbDataAdapter

    ("select * from Table1", OleDbConn2);
                OleDbCommandBuilder OleDbCB = new

    OleDbCommandBuilder(OleDbAdapter2);
     OleDbAdapter2.Fill(ds,"Table1");

                OleDbCB.GetInsertCommand();
                OleDbCB.GetUpdateCommand();
                ds.Tables["Table1"].Merge(ds.Tables

    ["Table1_add"],false,MissingSchemaAction.Ignore);
               
                //OleDbCB.DataAdapter.Update(ds, "Table1");
                OleDbAdapter2.Update(ds, "Table1");//这两种那个对?

                OleDbConn1.Close();
                OleDbConn2.Close();

     

     

    请问这样怎么不报错,也不追加数据呢?

    2008年12月23日 13:11
  • 看一下这里的例子和Merge方法的解释:
    http://msdn.microsoft.com/zh-cn/library/803bh6bc.aspx
    2008年12月23日 13:38
    版主
  •  

    我已经看了msdn的文章了,他不包含写回数据,我的那个代码不报错,也不做事。苦恼了。。。。
    2008年12月23日 14:06
  •  

    为什么要把table写成两个名字呢  名字需要一样的

     

    "table1" 和"table2"  就算成员一样  merge以后也会出错的吧

     

     

    2008年12月23日 14:36
  •  

    用一个数据集那两个表名就不能一样了吧。
    2008年12月23日 14:40
  • 你好!
       这样试试:

               ds.Tables["Table1"].Merge(ds.Tables

    ["Table1_add"],true,MissingSchemaAction.Ignore);

    2008年12月23日 14:41
    版主
  •  

    还是不行,是不是那个回写命令必须重写OleDbDataAdapter的updatecommand这个命令呢?然后再用OleDbDataAdapter.update(ds.Tables["Table1"]),这是不能用OleDbCommandBuilder的Getupdatecommand()获取来的update命令呢?

     

    能不能在msn上聊一会儿,我的是anhl_70@hotmail.com

    我加你了,你不在线么?

    2008年12月23日 15:22
  •  

    试了,还是不行。

     

    会不会因为表中有ID递增值项,才不能更新到数据库中

    2008年12月23日 15:30
  • 那就是你的 insert 语句问题了

     

    需要的话我再给你写个例子?
    2008年12月24日 0:01
  •  韦恩卑鄙 写:

    那就是你的 insert 语句问题了

     

    需要的话我再给你写个例子?

     

    那就太感谢了。

    那个getinsert()不就能自动生成么?怎么还要自己添加insert语句呢?

    不用OleDbDataAdapter.update(ds.Tables["Table1"]),用OleDbDataAdapter.insert(ds.Tables["Table1"])这个可以添加近来吗?

     

    或者直接用OleDbDataAdapter.insert(ds.Tables["Table1"]),不用合并的命令了,这样也可以吗?

    2008年12月24日 0:05
  • 能不能用SQL语句完成两个数据库表的插入操作呢?

     

    比如:

    Code Snippet

    将A库中的Table1中的数据,添加到B库中Table1中数据的尾部。            
                
                //原数据集
                string strSql = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=a.dat;Persist Security Info=True;Jet OLEDB:Database Password=";
                OleDbConnection OleDbConns = new OleDbConnection(strSql);
                OleDbConn1.Open();
                strSql = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=B.dat";Persist Security Info=True;Jet OLEDB:Database Password=";
                OleDbConnection OleDbConn2 = new OleDbConnection(strSql);
                OleDbConn2.Open();

     

      string SQL = "insert A.Table1(a,b,c) select * from B.Table1";
      

      OleDbCommand Ocmd = new OleDbCommand(SQL, OleDbConn1);

      Ocmd.ExecuteNonQuery;
      但是这里有一个跨连接数据库的问题,怎么能保障那个SQL语句正确执行。

                OleDbConn1.Close();
                OleDbConn2.Close();

     

     

    这就直接操作数据库了,但是没有操作数据集效率高,也不好实现。

    2008年12月24日 1:43
  •  NetAD 写:
     韦恩卑鄙 写:

    那就是你的 insert 语句问题了

     

    需要的话我再给你写个例子?

     

    那就太感谢了。

    那个getinsert()不就能自动生成么?怎么还要自己添加insert语句呢?

    不用OleDbDataAdapter.update(ds.Tables["Table1"]),用OleDbDataAdapter.insert(ds.Tables["Table1"])这个可以添加近来吗?

     

    或者直接用OleDbDataAdapter.insert(ds.Tables["Table1"]),不用合并的命令了,这样也可以吗?

     

    那就需要把所有的ds.Tables["Table1"]的行都标记为新增行

     

     

    foreach ( Datarow r  in ds.Tables[“Table1”].rows )

    {

    r.RowState = DataRowState.Added;

     

    }

    OleDbDataAdapter.insert(ds.Tables["Table1"])

     

     

     

    2008年12月24日 2:05
  •  韦恩卑鄙 写:
     NetAD 写:
     韦恩卑鄙 写:

    那就是你的 insert 语句问题了

     

    需要的话我再给你写个例子?

     

    那就太感谢了。

    那个getinsert()不就能自动生成么?怎么还要自己添加insert语句呢?

    不用OleDbDataAdapter.update(ds.Tables["Table1"]),用OleDbDataAdapter.insert(ds.Tables["Table1"])这个可以添加近来吗?

     

    或者直接用OleDbDataAdapter.insert(ds.Tables["Table1"]),不用合并的命令了,这样也可以吗?

     

    那就需要把所有的ds.Tables["Table1"]的行都标记为新增行

     

     

    foreach ( Datarow r  in ds.Tables[“Table1”].rows )

    {

    r.RowState = DataRowState.Added;

     

    }

    OleDbDataAdapter.insert(ds.Tables["Table1"])

     

     

     

     

    那我用表插入行是否能同样设置行状态呢?

    Code Snippet

    foreach (DataRow dr in Table1.Select())

    Table2.ImportRow(dr);

    这里用不用表的提交更新呢?

    Table2.AcceptChanges();

     

    OleDbAdapter2.Update(Table2);

     

     

     

    2008年12月24日 2:42
  • 2008年12月24日 2:49
    版主
  • 这么写完代码,是可以执行的,但数据库中始终没有追加新的数据。急死啦。。。。。。

    2008年12月24日 2:52
  • 我上面不是说了吗,你用Merge用的方式有问题,你了解一下MSDN中的解释就明白了,你需要改变行状态,然后在Merge。
    不需要AcceptChanges了,不然有不能更新了!
    2008年12月24日 2:52
    版主
  • Table2.AcceptChanges();

    会强行把行状态改回来    强烈禁止用AcceptChanges

    2008年12月24日 2:54
  • MissingSchemaAction.Ignore

     

    这一句措了

     

    要你直接merge (table1) 但是你用了参数  用了参数还用错了  bs Stick out tongue

     

    正确的方式是


     

     

    this.Merge(table, false, MissingSchemaAction.Add);

    或者

     

    this.Merge(table);

    2008年12月24日 3:00
  • 我知道啦。可是数据库中不见追加近来数据呀。

    2008年12月24日 3:00
  • 问题好像处在UPdate命令对象是空null上了

    我试图显示OleDbAdapter2.updatecommand.commandtext这个属性,报对象为空。

    2008年12月24日 3:15
  • 我最终看到数据库中的变化使用的下面语句

     

    Code Snippet

                DataTableReader r = Table1.CreateDataReader();
                Table2.Load(r, LoadOption.Upsert);

      OleDbAdapter2.Update(Table2);

     

     

    请问高手们,这样问什么就能写入数据库,而用合并区不能写回去呢?
    2008年12月24日 5:13
  • 这下我明白点了,行状态是很重要的。

     

    2008年12月24日 6:27
  •  

    为了报答楼上各位大大  你还是把帮到你的回帖打个对号吧  Big Smile
    2008年12月24日 8:42