积极答复者
请教关于用数据集来追加另一个数据库中的表数据。

问题
-
最终是这样解决的,请大家指教。看看还有没有其他更好的解决办法。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#呢?还是数据库问题呢?)
- 已移动 Sheng Jiang 蒋晟Moderator 2011年7月31日 3:23 System.Data (发件人:Visual C#)
答案
-
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
-
DataSet.Tables是只读属性,不能赋值。
当将新的源 DataSet 合并到目标中时,DataRowState 值为 Unchanged、Modified 或 Deleted 的任何源行都会与具有同一主键值的目标行相匹配。DataRowState 值为 Added 的源行将匹配主键值与新源行相同的新目标行。 -
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参数集合
-
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
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
-
DataSet.Tables是只读属性,不能赋值。
当将新的源 DataSet 合并到目标中时,DataRowState 值为 Unchanged、Modified 或 Deleted 的任何源行都会与具有同一主键值的目标行相匹配。DataRowState 值为 Added 的源行将匹配主键值与新源行相同的新目标行。 -
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参数集合
-
韦恩卑鄙 写: Code SnippetDataSet 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没有变化
-
韦恩卑鄙 写: Code SnippetDataSet 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没有变化
-
看了,没用那个提交命令,就是合并后用UPDATE更新回写到数据库中的,可是不报错,也没有追加进取数据的。
我是这样写的
Code Snippet将A库中的Table1中的数据,添加到B库中Table1中数据的尾部。
DataSet ds = new DataSet();
//原数据集
string strSql = "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=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;DataSource=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 = newOleDbCommandBuilder(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();请问这样怎么不报错,也不追加数据呢?
-
还是不行,是不是那个回写命令必须重写OleDbDataAdapter的updatecommand这个命令呢?然后再用OleDbDataAdapter.update(ds.Tables["Table1"]),这是不能用OleDbCommandBuilder的Getupdatecommand()获取来的update命令呢?
能不能在msn上聊一会儿,我的是anhl_70@hotmail.com
我加你了,你不在线么?
-
能不能用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();这就直接操作数据库了,但是没有操作数据集效率高,也不好实现。
-
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"])
-
韦恩卑鄙 写: 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 Snippetforeach (DataRow dr in Table1.Select())
Table2.ImportRow(dr);
这里用不用表的提交更新呢?
Table2.AcceptChanges();
OleDbAdapter2.Update(Table2);