以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  如何传递一个表到sql数据库的储存过程中?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=98569)

--  作者:HappyFt
--  发布时间:2017/4/1 11:01:00
--  如何传递一个表到sql数据库的储存过程中?
在前台程序中用动态sql语句拼成语句向表中插入一些行如:
"inert into 表名(字段1,字段2.....) 
se lcet (值1,值2.......)  union all
se lcet (值1,值2.......) "

想将这些新增的数据行做为一个表传到储存过程中再和其他后台表关联更新数据,因为不同表的字段数量不一致所以不能用固定字段的表面量,
代码要怎么写? 
还是说只能传入这个拼成的sql语句进到储存过程中生成一个临时表来用?

谢谢!



--  作者:有点蓝
--  发布时间:2017/4/1 11:23:00
--  
还是直接传入这个sql吧。其它方法都比较麻烦
--  作者:HappyFt
--  发布时间:2017/4/10 10:35:00
--  
如果我用了这样的函数来执行事务:如下
Dim SqlList As List(of String) = Args(0)
Try
    Connections(Mydata).BeginTransaction() \'开始事务
    Dim cmd As new SQLCommand
    cmd.ConnectionName = Mydata
    For Each sql As String In SqlList
        cmd.CommandText = sql
        cmd.ExecuteNonQuery()
    Next
    
    If vars("允许保存") = "NG" Then  \'如果执行中出错ft语法错误则回滚
        Connections(Mydata).Rollback()  \'回滚事务
    Else
        Connections(Mydata).Commit()  \'提交事务
        sqlList.Clear()  \'清空集合
        Return "OK"
    End If
Catch ex As Exception
    Connections(Mydata).Rollback()  \'回滚事务
    msgbox(ex.tostring)      \'返回错误信息
    sqlList.Clear()  \'清空集合
    Return "NG"
End Try

我想问一下,如果其中的一个sql语句是调用sql数据库中的一个储存过程跨表更新其他表中的数据,那这个储存过程会一起加入到事务中来,同时提交或者回滚吗?

如果不能,中间执行出了错数据就不一致了.要怎么样才能让这个储存过程和上面这些sql集合中的每个sql语句一起执行或回滚叱?


--  作者:有点色
--  发布时间:2017/4/10 10:55:00
--  

 你补充下这个知识吧 https://www.baidu.com/baidu?wd=sqlserver+%E5%B5%8C%E5%A5%97+%E5%9B%9E%E6%BB%9A&tn=monline_4_dg&ie=utf-8

 


--  作者:HappyFt
--  发布时间:2017/4/10 11:25:00
--  
看的似懂非懂,是否在执行那个储存过程后返回@@ERROR的值,如果不为0表示执行储存过程出错,事务函数就不提交即可,
是否可以这样理解?

--  作者:有点色
--  发布时间:2017/4/10 11:28:00
--  

 是的,可以这么理解。


--  作者:HappyFt
--  发布时间:2017/4/10 11:44:00
--  
那还有个问题,如果这个储存过程执行没问题返回0,可以继续执行其他事务,但如果其他事务出错了回滚,又要怎么回滚那个已经执行的储存过程呢?
--  作者:有点蓝
--  发布时间:2017/4/10 12:00:00
--  
存储过程里不需要再用事务,除非你显式提交了,否则多次调用存储过程也是会参与到顶层事务中的
--  作者:有点色
--  发布时间:2017/4/10 12:11:00
--  
 你的存储过程里面写有事务吗?如果事务没有提交过,都是可以回滚的。
--  作者:HappyFt
--  发布时间:2017/4/10 12:31:00
--  
储存过程里面没有事务,就类似这样:
CREATE PROCEDURE MyProcedure
AS
BEGIN
    SE T NOCOUNT ON;
    DE LETE FROM rxqz WHERE qz = \'rx015 \'; --删除数据
    UPDATE sz SE T name = \'李丽s\' WHERE name = \'李丽\'; --修改数据
END;

事务函数中有这样一句调用了这个储存过程
Dim cmd As New SQLCommand
cmd.Connection Name = Mydata
cmd.CommandText = "Exec MyProcedure" 

就想实现 函数中的其他事务语句和上面调用的这个储存过程要么同时执行,要么同时回滚