MIDAS 中如何快速、批量添加数据(100分)

  • 主题发起人 主题发起人 kaida
  • 开始时间 开始时间
K

kaida

Unregistered / Unconfirmed
GUEST, unregistred user!
我在服务器端有一个paradox表,有一个字段(主键)是Autoincrement类型。
想在客户端一次批量从Foxpro表中导入数据(ApplyUpdates(0))。但是出现
“key viotion”错误?难道Autoincrement字段在MIDAS中不会自动递增?
如果主键改为number类型,用代码使其递增则不会出现“key viotion”错误,
但是一次添加数万条数据仍然不行。如果每添加一条数据就ApplyUpdates一次,
速度又慢的无法忍受。应如何解决?请高手们帮忙,谢谢。
 
哪位高手指点一下,好吗?
 
第一个问题:插入记录时插入字段中不要有自动增长字段。
第二:
最好该用sql数据库,然后
采用sql语句插入数据。
1。插入字段中不要有自动增长字段或自动修改字段。
2。中间成要允许多条更新。
每条语句中插入多条记录
insert into table1 field2,field3,...
values (v2,v3,...)
(v2,v3,...)
 
我现在解决的办法是:
1. 用 TQuery 取代 TTable。但不知道为什么不能用 TTable。
2. 分批更新数据(每250条记录ApplayUpdates一次)。但不知道为什么不能一次更新全部记录。
敬请指教。
 
A我想还是因为自动增长字段的原因,原因如B2
产生的sql语句包含了自动增长字段,所以无法添加。
(无论中间层何种更新方式,均要包含关键字段,自动增长字段属于关键字段)
B
首先,paradox表执行的是borland的local_sql语言,与标准sql语言有不少差别。
其次,采用三层结构,在中间层上,dataprovider自动对客户端发来的信息,如修改、删除、插入操作等
自动产生sql语句。所以,所有对数据的修改都是通过sql语句来完成的。
第三,local_sql语句不支持多值表的insert into语句,所以只能一条条的插入,也就是每
条记录都要执行一条sql语句。
再加上三层结构中数据传输时要对数据进行打包、解包、类型转换等处理,所以数据量大时,速度
就缓慢了。
最后,你能否试一试在中间层放置一个Tquery,将他设为单向(unidir。。属性),专门
用于添加数据?(三层没有用bde,自己没有试验过)看看能否增加一点性能?
 
to admintty:
谢谢回答。
‘产生的sql语句包含了自动增长字段,所以无法添加。’-但是我用TQuery控件为什么可以(用TTable不行)?
‘只能一条条的插入’-但是我是每次添加250条记录,运行正常(每次添加上万条记录就不正常),为什么?
 
#但是我是每次添加250条记录,运行正常(每次添加上万条记录就不正常),
我想,你所说的每次添加250条记录,应当是在客户端用clientdataset添加完250条记录后,
使用applyupdates提交记录。但是在中间层,它还是产生了至少250条插入的sql语句。
也就是说,每条记录产生一条。
(若采用dbexpress,可以在中间层放置一个sql语句跟踪,跟踪记录中很明显的可以看出来)
#但是我用TQuery控件为什么可以
问题 1、你采用的中间层是怎样的更新模式?
2、自增数据字段的更新模式?
我使用dbexpress,采用的数据表包含了时间标记字段(timestamp),不过它不能作为主
键,如果不改变数据字段的更新模式,提交时就会出现冲突。将字段的更新模式(中间层、
客户端)该为不更新后,就一切正常了。
我是据此推断的。
 
借个光!
三层中如何执行sql语句?使用clientdataset的哪个方法?
 
to admintty:
我是在客户端用clientdataset添加完250条记录后,使用applyupdates提交记录。您说中间层产生了至少250条插入的sql语句的我想也是正确的。
我只是不明白,在客户端用clientdataset添加完万条(实际测试用300条)记录后同样提交记录就不行。
UpdateMode:upWhereAll
RequestLive:False(TQuery)(TTable没有此属性)
 
to ninglng:
用 CommandText
 
设计思路可以转一转,可以将记录存入临时的clientdataset中,
再由接口传入中间层.由中间层再行导入.
 
看清楚阿,是执行的命令、方法!不是sqlstring?
晕!题都不细看,怎么回答?
 
zhanggeye 的思路很好,能不能详细说明如何将临时clientdataset中的数据传到中间层,谢谢。
to ninglng: 对不起,问题没有看清楚。现回答如下:牵涉到cursor用open,否则用Execute。
 
to kaida:
可以将dataset的data属性重新赋给临时的dataset的data属性即可,对临时的dataset操作同
一般的用法一样。完成操作后再进行逆操作。
谢谢你的回答!
 
数据库中只有一条记录,使用dbgrid显示时,出现多条记录,而且在滚动记录后不断的增多是怎么回事?怎么解决?
欢迎交流:qq:84533116,注明:dbgrid
 
to zhanggeye:
数据到了中间层,还不是一样由provider产生同样多的插入(insert into)local_sql语句,
和直接使用tquery应当没有多大的区别吧?
(数据库是paradox表,不支持多值插入语句的)
to kaida:
>>我只是不明白,在客户端用clientdataset添加完万条(实际测试用300条)记录后同样提交记录就不行。
你所说的不行是指速度、反映慢吗?若是,那因为数据量大了,没办法,除非改用其他的
支持标准sql的数据库(允许多值表插入语句的)。
如果是指出错,我也就不清楚了。会不会是因为其他原因?
 
to admintty:速度慢且不说,还出错!添加记录后再打开,全部记录的数据都是一样的。
TO ninglng:谢谢提醒,我试试。
你说的DBGrid问题我从来没有遇到过,不知你是在什么情况下发生的?
 
一个主表一个从表
使用clientdataset 的mastersource属性、masterfields等关联后,从表打开后的记录数就同实际不符。
你一般主从表是怎么处理的?
qq:84533116
 
to ninglng:我是在中间层建立主从关系的,尽量把逻辑关系放在中间层,这样更符合‘多层’思想。
 
后退
顶部