如何将检索到的结果传给SQL的临时表?

JERRY_LIU 2005-04-03 08:40:32
我在vb.net内的datagrid内修改了n行记录,将修改过的记录挑选出来后,想更新sql里的table,有人建议我先存在临时表里面,再转存入真正的table里,如果用insert 将记录一行一行存入临时表的话,如果有十行不是要执行十次存储过程?有没有更简单有效的方法?
然后,临时表的数据是否可以用一句update的语句来更新?还是也得一行一行确认ID后再update?
...全文
302 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
foxbuilder 2005-04-04
  • 打赏
  • 举报
回复
一般来说,有使用临时表和使用触发器两种方法.
个人认为,触发器使用起来更简单, 但对于复制更新(如需根本每条记录处理不同的逻辑代码往往太复杂,所以我一般采用临时表.
对于你所说的问题

q:
因为我的记录有可能几条是修改原资料,有几条是新增的,所以当我从临时表中往数据库里更新时,不能一条INSERT搞定。(我现在的想法是在vb.net里通过datarow.rowstate来判断)


a: 所谓更新,其实包括(新增,修改,删除), datarow.RowState 可以记录可以反映行的状态是(已新增,已修改,或已删除), 临时表结构,除了依照源表的结构的结构外,我自己另外加一了个nRowState(smallint)类型的字段,用以在临时表中保存每一行的RowState.

此种方法需要注意一点,你遍历每一个datarow的时候,你会发现DataState为Deleted的行并不能被你直接访问, 此时我采取的方法是


If dr.RowState = DataRowState.Deleted Then
IsDelete = True
dr.RejectChanges()
End If
在临时表中加入此行
If IsDelete Then
dr.Delete()
End If


q:
将记录存入临时表时,在.net下用sqlcommand执行存储过程,一个过程用来新建临时表,另一个用来新增记录,如果有十条记录那我就得执行sqlcommand.ExecuteNonQuery()十次?
我还担心我建立的是局部临时表,会不会当我执行第二次sqlcommand时,该表就不存在了?

a:
dim conn sqlconnection = getconn()
...
sqlcommand.ExecuteNonQuery(...) '建立临时表
dim dr as datarow
for each dr in dt.rows
sqlcommand.ExecuteNonQuery(...) '插入每行至临时表中....
end for

保证每次的sqlcommand使用的是同一个连接. 临时表都会有效.

至于调用效率,我觉得大可不必担心, 一次几十上百条记录应该是不会有太大感觉的.










dim conn as sqlconnection = getconn

hamadou 2005-04-04
  • 打赏
  • 举报
回复
可以判断行状态,或者使用dataview(取得是added的行),一般来说如果想往临时表里插入,就得一行一行做了。所以有多少次就要调多少次,有10条就要执行10次。临时表的使用见
terryshi(terryshi) 所说。
JERRY_LIU 2005-04-04
  • 打赏
  • 举报
回复
TO: hamadou(闵峰)
因为我的记录有可能几条是修改原资料,有几条是新增的,所以当我从临时表中往数据库里更新时,不能一条INSERT搞定。(我现在的想法是在vb.net里通过datarow.rowstate来判断)

将记录存入临时表时,在.net下用sqlcommand执行存储过程,一个过程用来新建临时表,另一个用来新增记录,如果有十条记录那我就得执行sqlcommand.ExecuteNonQuery()十次?
我还担心我建立的是局部临时表,会不会当我执行第二次sqlcommand时,该表就不存在了?

TO:  harryho(基路亚)
触发器还没用过,正在学习中,谢谢你的回覆
terryshi 2005-04-04
  • 打赏
  • 举报
回复
select * into #temp_table form AAAA
临时表的定义和普通表是一样的,不同的是在访问结束后会自动删除
#XX表示局部临时表,一次查询后删除。
##XX表示全局临时表,一次连接后删除,差不多是SqlConnection.Close()。
hamadou 2005-04-04
  • 打赏
  • 举报
回复
存储进临时表如果使用存储过程自然要有多少条记录循环调用多少次。但最后更新进table中可以使用一条sql语句,insert into table_name select #temp_table.name,#temp_table.age等
JERRY_LIU 2005-04-04
  • 打赏
  • 举报
回复
如果按照foxbuilder的说法,当一行被删除时,先在临时表中删除该行,再从临时表导入原TABLE,等于是先把所有记录读入临时表,再把要删除的记录删掉,最后操作完后,将整个临时表的记录去覆盖原TABLE的全部记录.

如果表的记录不多还好,如果有上万条,这样不好吧。

如果我只提取被ADD,UPDATE,DELE的记录ID,直接存入原TABLE,不是少了一个中间环节?为什么要用临时表来中转?
harryho 2005-04-03
  • 打赏
  • 举报
回复
如果你是用SQL SERVER的话,我建议用TRIGGER.用TRIGGER的话就有一个甘样的表INSERTED专门来用存放你修改和插入表的记录.你可以用这个表的记录去更新你的TABLE.

create trigger trigger_name on table_name
for update,insert as
update table set 字段名= from inserted where ....


16,557

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧