Foxtable(狐表)用户栏目专家坐堂 → 如何传递一个表到sql数据库的储存过程中?


  共有2521人关注过本帖树形打印复制链接

主题:如何传递一个表到sql数据库的储存过程中?

帅哥哟,离线,有人找我吗?
HappyFt
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
如何传递一个表到sql数据库的储存过程中?  发帖心情 Post By:2017/4/1 11:01:00 [显示全部帖子]

在前台程序中用动态sql语句拼成语句向表中插入一些行如:
"inert into 表名(字段1,字段2.....) 
se lcet (值1,值2.......)  union all
se lcet (值1,值2.......) "

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

谢谢!



 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By: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语句一起执行或回滚叱?


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/4/10 11:25:00 [显示全部帖子]

看的似懂非懂,是否在执行那个储存过程后返回@@ERROR的值,如果不为0表示执行储存过程出错,事务函数就不提交即可,
是否可以这样理解?

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/4/10 11:44:00 [显示全部帖子]

那还有个问题,如果这个储存过程执行没问题返回0,可以继续执行其他事务,但如果其他事务出错了回滚,又要怎么回滚那个已经执行的储存过程呢?

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By: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" 

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


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/4/10 15:34:00 [显示全部帖子]

原来的跨表更新的代码全部写在beofresavedatarow,那样不是效率很低吗?想改到储存过程中,又不知道怎么处理事务回滚的问题才有此问,觉得可行才行动啊

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/4/10 16:25:00 [显示全部帖子]

原来是用ft默认的方式保存,beforesavedatarow主要是方便用dr("列1")补捉到变化的数据然后添加到事务函数中遍历执行,
现在就是改用保存按钮直接通过sql函数一次性保存窗口表中所有的数据了,但就是每个窗口的表不同,跨表更新的数据不一样,如果用函数每个窗口的跨表更新都需要一个太多了,而且每次变动都要发布更新,所以想直接在sql数据库中写不同的储存过程来调用,如果想变动直接在sql数据库上修改存储过程就不用再发布新版 本了.
所以才有了上面那些问题.

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/4/10 17:07:00 [显示全部帖子]

用sql一次性保存本窗口的几个表的数据都没有问题, 主要是跨表更新数据的问题

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:a1.txt


附件是采购入库单beforesavedatarow的代码, 保存时要根据品质判断的不同更新库存表中不同的库存数量,更新采购明细中的累计入库等 
这个每行变动都要添加到事务中,所以我现在就想把整个表中变动的数据用sql拼起来一次性传入到储存过程中先生成一个临时表,然后存储过程中再用这个临时表联接其他想要的表来实现跨表更新的需求,这个功能通过储存过程来实现,怎么传递数据进去写过储存过程都没问题,
而是我在保存的sql事务函数中,一些sql语句是保存本表的数据,而一些就是调用这个储存过程来跨表更新数据
我的问题就是怎么保证这个储存过程中执行的sql语句的结果与其他的sql语句都同时生效,要么都不生效.

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/4/10 17:31:00 [显示全部帖子]

保存一个窗口中的几个表是可以,但是有很多的窗口,就有很多的不同的表啊,不同表字段不同,更新的数据也不同,不可能在一个函数中就全部实现,只能一个窗口就要写一个
函数所以我才想到用不同的储存过程来代替函数,好维护.还是没有回复到我的问题,到底能不能实现啊?

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1909 积分:16993 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2017/4/10 18:41:00 [显示全部帖子]

就是不知道哪种简便呢?我的sql保存的代码已经放在一个函数中,保存按钮就是执行这个函数将相关的sql语句添加到事务函数中一起执行
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:sqlsave.txt

但是跨表更新的就不知道怎么能写在一起(内容杂,不知道怎么写才共用),所以在sqlSave的最后面多了一行 tb.save 目的就是让它执行beforesavedatarow中的代码来拼写跨表更新的数据
然后在全局表事件的beforesavedatarow事件中又加一句e.cancel = true 来取消foxtable的保存.
感觉这样最终还是用beforesavedatarow来实现,很怪吧.

老师看看还有什么好的办法啊?


 

 回到顶部
总数 11 1 2 下一页