我方案中有2个数据库分在两地,数据表的结构一样。两地用户分别对两个数据库进行管理。
现在一个用户将数据修改之后,需要将数据文件导出,第二个用户将数据合并进来。
--------------------------
导出数据时我将数据集dataTable进行序列化,然后保存。
----------
导入步骤:
先将文件反序列化为 dataTable,取名Source,然后第2个用户将数据也读出成为datatable
string sql="select * from planeTable";
生成一个数据集合 Target,两个数据集合并的原则是:
1)如果Source 中有数据行是 Target中所没有的,则新增;
2)如果Source有数据行是Target也有的(主健相同),则用Source更新Target数据行。----------------------------------------
想来想去,我认为最简单的方法是用Merge,调用这个方法对两个数据集进行合并,然后再更新到数据库。但是程序运行时无错误,数据集却没有更新!!!!
现在一个用户将数据修改之后,需要将数据文件导出,第二个用户将数据合并进来。
--------------------------
导出数据时我将数据集dataTable进行序列化,然后保存。
----------
导入步骤:
先将文件反序列化为 dataTable,取名Source,然后第2个用户将数据也读出成为datatable
string sql="select * from planeTable";
生成一个数据集合 Target,两个数据集合并的原则是:
1)如果Source 中有数据行是 Target中所没有的,则新增;
2)如果Source有数据行是Target也有的(主健相同),则用Source更新Target数据行。----------------------------------------
想来想去,我认为最简单的方法是用Merge,调用这个方法对两个数据集进行合并,然后再更新到数据库。但是程序运行时无错误,数据集却没有更新!!!!
解决方案 »
- 由前帖引发:代码可读性与性能的选择
- 保存图片路径到sql05中:网上找了很长时间、弄了快一星期了,还是没弄好,请各位好心人进来帮帮,谢谢了
- 在程序中进行数据库的创建
- 类库访问不了Dispose()方法
- IP地址转为二进制紧凑模式,代码怎么写,急,100分在线等!!!!
- 这个怎么实现?
- ++++++++++++如何利用sql存储过程,删除一条符合条件的数据记录???
- 水晶报表如何在一页纸中打印相似的两个报表
- 我想我的TEXTBOX中只能输入A,B,C,D,....Z,这几个字母的大小写
- 请教个问题 关于数据库的
- 调试网站Web.config出现问题,请求解决
- DataTable 如何获得 与主键冲突的行号
Merge方法是将两个结构相似的datatable合并成一个datatable:
DataTable dt1 = new DataTable();
dt1.Columns.Add("id");
dt1.Columns.Add("name");
dt1.Columns.Add("pwd");
for (int i = 0; i < 5; i++)
{
dt1.Rows.Add(new object[] { i.ToString(), "name" + i.ToString(), "" });
}
DataTable dt2 = new DataTable();
dt2.Columns.Add("id");
dt2.Columns.Add("name");
dt2.Columns.Add("pwd");
for (int i = 5; i < 10; i++)
{
dt1.Rows.Add(new object[] { i.ToString(), "name" + i.ToString(), "" });
}
DataTable dt3 = null;
dt3 = dt1.Clone();
if (dt3 != null)
{
dt3.Merge(dt1);
dt3.Merge(dt2);
}
insert into opendatasource('SQLOLEDB','Data Source=IP地址;User ID=sa;Password=').库名.dbo.test
select * from opendatasource('SQLOLEDB','Data Source=IP地址;User ID=sa;Password=').库名.dbo.producth
where 条件
我现在的代码可以看到合并后的数据集,可是提交不到数据库中
{......
Database util = new Database();
SqlDataAdapter ada = new SqlDataAdapter();
ada.SelectCommand = new SqlCommand("select * from Produce_PlaneRepair",Database.getConnection()); DataTable tb = new DataTable("plane");
ada.Fill(tb);
this.dataGridView2.DataSource = tb;
DataTable dtTemp = new DataTable("plane");dtTemp = (DataTable)AcceptDataList[11];//用接收到的数据集tb.Merge(dtTemp);
tb.AcceptChanges();
ada.Update(tb);
this.dataGridView3.DataSource = tb;-------我可以在dataGridView3中看到合并的数据,但是数据库中没有数据
我不太喜欢程序员动不动说“最简单的.......”,如果有bug,简单有什么用?这个东西最多用1天写就,如果3天还不能非常可靠地完成(以致可以忘记它),那就应该删除了源代码重新设计。我从来不使用DataSet、DataTable。假设使用DataTable,我肯定不会使用Merge。DataTable只能用于传输数据,真正的合并(查找、判断、插入、删除、替换,等)还是要用数据库来完成。
1)在本地机创建一个临时表,用来存放该DATAtable,还是需要用dataAdapter方式将该datatable导入到临时表中。
2)在本地数据库中,对临时表与本机数据库的数据进行每行的比较,如果本地机没有数据则添加,如果有则更新。
这样的方法我感觉也很麻烦,性能如何很难说。
但我只是觉得这样来的不明不白的,不如我一行一行读灵活,更深的理解没了,
还有什么原因不用DataSet、DataTable吗
程序读文件,导入数据库临时表,再用我的SQL很简单搞定
记住,要有一个关键字字段是永远不能变化的,用这个做索引添加
这个我做ERP时做过
各分公司的表有一字段是分公司表的ID,和分公司ID
我那个SQL条件是
where 公司ID=?and 分公司表ID not in (select 分公司表ID from 总表 where 公司ID=? group by 分公司表ID)
我写的时
insert into 本地表
select * from 临时表 where 主键 not in (select 主键 from 本地表)但是更新语句呢?我一个表有60多个字段,总不好一个字段一个字段update 本地表 set 字段1=
先
delect 本地表 where 主键 in (select 主键 from 临时表)
再
insert into 本地表 select * from 临时表