比如输入发票、领料单等单据,我们编程基本不用DBGrid,而用StringGrid,因为:
1、Dbgrid显示数据后,不断开连接的话,总是占着数据库服务器资源,用户不多还可以,用户一多,连接数据库的数目也就相应增加,势必严重消耗服务器资源;StringGrid就没有这问题,从数据库提取数据,循环方式写入单元格中。
2、在Dbgrid上,输数据不能马上检测错误,比如,某一列为关键字,不能重复,输的时候重复了,等提交了,数据库给你返回一串用户不能看懂错误信息,因为Dbgrid在编辑状态下,不能读其单元格数据先进行检测,而要等到提交数据库才能检测(不直接在单元格输,另外弹出界面在Edit或其他编辑控件中输除外);
如果在StringGrid上,就可以先读取进行检测然后在提交数据库。
当然,各有各的缺点,各有各的优点。现在我有这样的问题:
假如我填好了一帐领料单(有多条数据),在提交数据库时可以有两种方法:
1、循环提交给数据库,但是,如果提交了部分,产生了意外错误,那肯定不能全部Rollback;
2、循环提交给数据库,先写入临时表,然后一次性写入正式表,这期间产生错误,肯定能全部Rollback。但是我发现这种方法效率不是很高。
请问,能否把表单StringGrid中的变动过的数据逐行先写入数组,然后再提交数据库,然后在过程中循环写入表中,这样产生错误既能全部Rollback,效率也会提高点。但是,数组怎么传给数据库(SQL Server2000),且Sql中好象没有定义数组的?
谢谢各位指教!
5 个解决方案
#1
望各位指教!
#2
我们做这个也是用StringGrid
但我做的多层,在中间层中去RollBack
但我做的多层,在中间层中去RollBack
#3
回Cipherliu(孤鹰) :什么“在中间层中去RollBack”,不懂你的意思,麻烦能不能说得详细点,另外,针对我的关键问题,发表一下你的高见。谢谢!
#4
这个很麻烦,我的做法是生成数据处理的SQL语句,然后提交这批SQL语句.
这个在VB中曾经写过
这个在VB中曾经写过
#5
--在VB中的思路是这样的(当然,也可以直接在程序中开启事务,然后逐条执行SQL语句)
--处理的存储过程.
create proc p_process
@sql ntext
as
begin tran
exec(@sql)
commit tran
go
--然后在程序中,生成这样的SQL处理语句,比如插入:
insert 表(字段列表)
select 值列表1
union all select 值列表2
...
将这个字符串赋值给存储过程的参数,并执行存储过程
--处理的存储过程.
create proc p_process
@sql ntext
as
begin tran
exec(@sql)
commit tran
go
--然后在程序中,生成这样的SQL处理语句,比如插入:
insert 表(字段列表)
select 值列表1
union all select 值列表2
...
将这个字符串赋值给存储过程的参数,并执行存储过程
#1
望各位指教!
#2
我们做这个也是用StringGrid
但我做的多层,在中间层中去RollBack
但我做的多层,在中间层中去RollBack
#3
回Cipherliu(孤鹰) :什么“在中间层中去RollBack”,不懂你的意思,麻烦能不能说得详细点,另外,针对我的关键问题,发表一下你的高见。谢谢!
#4
这个很麻烦,我的做法是生成数据处理的SQL语句,然后提交这批SQL语句.
这个在VB中曾经写过
这个在VB中曾经写过
#5
--在VB中的思路是这样的(当然,也可以直接在程序中开启事务,然后逐条执行SQL语句)
--处理的存储过程.
create proc p_process
@sql ntext
as
begin tran
exec(@sql)
commit tran
go
--然后在程序中,生成这样的SQL处理语句,比如插入:
insert 表(字段列表)
select 值列表1
union all select 值列表2
...
将这个字符串赋值给存储过程的参数,并执行存储过程
--处理的存储过程.
create proc p_process
@sql ntext
as
begin tran
exec(@sql)
commit tran
go
--然后在程序中,生成这样的SQL处理语句,比如插入:
insert 表(字段列表)
select 值列表1
union all select 值列表2
...
将这个字符串赋值给存储过程的参数,并执行存储过程