两个结构不同的内存数据表中对应记录的同步问题

问题描述

内存中有两个数据表,表一来自SQL数据库查询,表二是从客户端提交的XML转换来的,表结构不一样,现在想用表二的值来更新表一中对应ID的记录中字段名相同的值。表一:id,tname,tcount,tnote111122223333表二:id,tname,tt,tnote,pk111ab33ccc44444要把表一更新为:id,tname,tcount,tnote111a333c44null4说明:记录3删除了增加了记录4共有的字段数据更新成了表二的值新增的记录因为缺少对应项,所以tcount字段是空的表一中有的字段,按ID对应更新成了表二的值~表一中有的ID表二没有的记录从表一中删除表一中没有的ID而表二又有的,增加到表一里问:什么方式来实现会最快~

解决方案

解决方案二:
晕哦,空格被忽略了~
解决方案三:
补充一下,上面只是个例子,实际问题是,只知道一定有一个id这种对应字段,并不确定表一和表二各有多少个字段,更不知道它们有多少个字段的名称是相同的,顺序也不确定。但是,只要字段名相同,则数据类型就是一样的~
解决方案四:
只能老老实实的表结构读出来,之后把xml对比表结构,一条一条操作吧.
解决方案五:
查找比对
解决方案六:
那如果不算ID,的情况下表一有X条记录Y个字段表二有M条记录N个字段需要比较X*Y*N+M*M*X这么多次吧~可能还更多,有没有办法可以减少运算呢~
解决方案七:
X*Y*N+M*N*X
解决方案八:
X*Y*M+M*N*X
解决方案九:
列固定就不用那么多了,不固定那只能遍历
解决方案十:
我先是生成一个新的数据表,三个字段:f_name,f_index1,f_index2f_name记录这两个数据表都包含的字段名称;f_index1记录这个字段在第一个数据表的索引;f_index1记录这个字段在第二个数据库的索引。生成这个表的好处是,更新值的时候不需要遍历所有字段了,只需要按照已经记录在案的索引来操作即可。因为我最终需要的是表一,所以这个表是这样得到的:用了两个嵌套的循环,外循环是表一的栏位遍历,内循环是表二的栏位遍历遍历表一的所有栏位,拿栏位名称与表二的所有栏位名称做对比,比较之前都先转换成了大写~遇到栏位名称相同的,就记录下来。为了较少比较的次数,此时还专门用BREAK退出了内循环~本来,我觉得已经登记过的索引应该在以后的比较中忽略掉,但是忽略也需要先做比较,这样看来好像并不能减少比较次数,所以就放弃了~得到这个【相同字段对应表】之后,再根据表一和表二的对应关系,先比较表一的记录在表二中是否存在,存在的话,就用表二的记录来更新表一的记录,如果不存在,就从表一中删除。然后比较表二的记录ID在表一中是否之前就存在,存在的话,因为之前已经更新过了,所以忽略,不存在的话,就把相同字段的值组成的新行添加到表一。之所以要先删除后添加,是为了第二次比较的时候待比较的行会少一些。另外,行更新之前,也可以做一次值的比较,因为两个表都有的ID值的那些行,有可能对应字段的值也是相同的,这种情况下,可以不需要用表二的值来更新表一的值,这样的好处是,表一的行状态可以保持为Unchanged。这样如果需要用表一来更新数据库,则有可能大大减少发往数据库的命令。关于这一点,我还没有做实验,暂时只是猜测。我还没有搞清楚如果用同样的值来修改行,会不会改变行状态,更不知道,如果多次被修改成另外的值的记录,在提交之前再被修改回来的话,更新数据库的时候会不会忽略它。这里说的再次被修改回来是指【RejectChanges】以外的方法,因为【RejectChanges】的话,行状态是会重置为Unchanged的~这个,我明天试验一下~
解决方案十一:
引用9楼xiaomanger的回复:

我先是生成一个新的数据表,三个字段:f_name,f_index1,f_index2f_name记录这两个数据表都包含的字段名称;f_index1记录这个字段在第一个数据表的索引;f_index1记录这个字段在第二个数据库的索引。生成这个表的好处是,更新值的时候不需要遍历所有字段了,只需要按照已经记录在案的索引来操作即可。因为我最终需要的是表一,所以这个表……

学习lz的发帖精神感觉这些比较的次数还算可以了如果数据量不大没什么感觉的
解决方案十二:
在比较次数不能减少的情况下看看对象是否有优化的可能减少大对象的实例化和在内存中不必要的操作当然这些前提是数据量达到一定地步数据量不大的话没什么关系至于多少数据量算大看实际情况吧
解决方案十三:
俺搞定了这个问题~用数据表dt_1来更新数据表dt_2其他参数用来指定主键名称或者主键的索引datable_update(DataTabledt1,DataTabledt2,stringkeyname)datable_update(DataTabledt1,stringdt1_keyname,DataTabledt2,stringdt2_keyname)datable_update(DataTabledt1,Int32dt1_key_index,DataTabledt2,Int32dt2_key_index)思路在9楼~坐等更好的法子~

时间: 2024-10-27 01:30:38

两个结构不同的内存数据表中对应记录的同步问题的相关文章

Sql Server中清空所有数据表中的记录_MsSql

Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: 复制代码 代码如下: exec sp_msforeachtable  @Command1 ='truncate table ?' 删除所有数据表: 复制代码 代码如下: exec sp_msforeachtable 'delete   N''?''' 清空SQL Server数据库中所有表数据的方法(有约束的情况) 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之

看实例学VFP:删除数据表中的记录

本例对看实例学VFP:对数据表中记录进行修改一文的实例进行了一点改进,增加了"撤消"功能.程序运行时如下图: 在组合框中选择要查找的字段,在文本框中输入查找内容后单击右侧的"查找"按钮后将查找结果显示在上方的表格中,"查找"按钮变成"撤消"按钮,同时激活"删除"按钮及用于显示数据的文本框,并将当前记录(满足查询条件的记录)的值同时显示在文本框中,:单击"删除"按钮后会删除查找出来的记录刷

看实例学VFP:向数据表中添加记录时自动生成编号

本例在"看实例学VFP:向数据表中添加记录并验证输入数据是否合法"的基础上进行了改进,实现了在添加记录时不仅能够完成对输入数据的校验,还具有自动生成编号的功能.自动生成编号的相关代码加在表单的init事件及"添加"按钮的click中,在表单第一次启动或添加完记录后都会调用此段代码,实现自动生成编号的功能.运行界面如下: 本例用到了"数据1"数据库中的"网站信息表",关于该数据库的情况已经在看实例学VFP:示例数据库一文中给出,

看实例学VFP:向数据表中添加记录并验证输入数据是否合法

本例的执行过程大致是在添加记录时首先使用empty()函数对接收数据文本框作是否为空的判断,使用locate做记录指针定位(关于vfp表记录指针定位和数据排序请参考:记录指针定位和数据排序),并判断是否和表中已有的数据重复.通过以上方式完成数据校验,如果满足非空.非重复的条件,则使用append blank命令在表中添加一条空白记录,然后使用replace命令将该记录的对应字段的值修改成表单上对应文本框内输入的值.程序运行时如下图: 本例用到了"数据1"数据库中的"网站信息表

如何有条件的分步删除数据表中的记录

数据|条件 如何有条件的分步删除数据表中的记录作者:eygle出处:http://blog.eygle.com日期:February 22, 2005« 自己动手,丰衣足食 | Blog首页 有时候我们需要分配删除数据表的一些记录,分批提交以减少对于Undo的使用,本文提供一个简单的存储过程用于实现该逻辑.你可以根据你的需要进行适当调整,本例仅供参考: SQL> create table test as select * from dba_objects;Table created.SQL>

Sql Server中清空所有数据表中的记录

清空所有数据表中的记录: exec sp_msforeachtable  @Command1 ='truncate table ?' 删除所有数据表: exec sp_msforeachtable 'delete   N''?'''

asp.net中如何把DataSet插入到一个结构完全相同的数据表中

问题描述 因为数据量很大,用遍历的方法很慢,现在想改用整体插入的方法:其中ds中是有数据的,,AccountBalance是数据库中的表名.但是运行完后没有错误,但数据库的记录也没有增加.就是毫无反应.SqlDataAdapterad=newSqlDataAdapter();SqlCommandBuildercustCB=newSqlCommandBuilder(ad);stringstrSql="select*fromAccountBalance";ad.SelectCommand=

Sql Server里删除数据表中重复记录的例子_MsSql

[项目] 数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除! [分析] 1.生成一张临时表new_users,表结构与users表一样: 2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录: 3.把users表改为其它的名称,把new_users表改名为users,实现我们的需要. [程序] 复制代

Sql Server里删除数据表中重复记录的例子

[项目] 数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除! [分析] 1.生成一张临时表new_users,表结构与users表一样: 2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录: 3.把users表改为其它的名称,把new_users表改名为users,实现我们的需要. [程序] 复制代