网络斗地主游戏的完整设计与实现(三)入口存储过程详解,理解动态调用存储过程的原理
引言
在前一篇文章中说到了一个核心技术路线,就是在js代码中通过ajax请求调用sqlserver中的存储过程。
下面对这一个调用过程在数据库端的工作过程做一个较为详细的说明。因为这里用到了在存储过程中动态调用其它存储过程的技术,所以值得细讲一下。
项目的源码可在CSDN资源中下载
入口存储过程
现在很多网络应用都在使用单入口技术。在本项目中通过一个入口存储过程,实现了单入口功能。下面看一下这个入口存储过程的代码
CREATE PROCEDURE dbo.callProc@procName varchar(100) ,@inStr varchar(200) ,@outStr varchar(4000) output
as
set nocount on
begindeclare @SQLString nvarchar(500)declare @ParmDefinition nvarchar(500)declare @outPara varchar(4000)if rtrim(ltrim(@inStr)) <>''beginset @inStr = @inStr + ','endset @SQLString = N'exec '+ @procName + ' '+@inStr+ '@outPara out'set @ParmDefinition = N'@outPara varchar(4000) OUTPUT' EXECUTE sp_executesql @SQLString, @ParmDefinition, @outPara=@outStr outputreturn 0
end
所有其它的存储过程都是通过这个入口存储过程被调用的,而所有的后台业务逻辑都是由存储过程来实现。所以这就是后台应用的一个单入口。
该存储过程有三个参数:
@procName varchar(100) ,
@inStr varchar(200) ,
@outStr varchar(4000) output
第一个参数指明要被调用的实现业务功能的存储过程的名字,第二个参数指明被实际调用的存储过程的的参数。此处参数是由逗号分隔的形式,所以可以传递任意数量的参数。 同时约定,被调用的存储过程返回一个json串,所以只需要一个输出参数就可以返回实际产生的结果。
在这里要说明一下,由于被调用的存储过程的名字是通过一个字符串参数传进来的,所以不能像通常调用存储过程那样
exec someSP,…
因为在写代码时,并不知道具体要调用哪一个存储过程,所以这里要运用到sqlserver的动态执行能力。而这一点是通过一个系统存储过程 sp_executesql 实现的。
这个sp_executesql 可以动态地执行sql语句,其能力相当于 javascript中的eval, php中的call_user_function。
由于可以动态地执行sql语句,所以代码变得很灵活。
可以这么说,如果sqlserver 没有提供 sp_executesql,就没有办法实现单入口存储过程。
对于sp_executesql的使用来说,输入参数的使用很简单,用逗号分隔开来就是了,但是输出参数的使用就要特别注意了
1,要先定义一个局部变量,用于接受输出的值
2,要在参数后面跟一个关键字 output
3, 要为sp_executesql 的第2个参数指定输出的参数的定义串
4,要为sp_executesql 的第3个参数指定接收输出的变量,并且要加上 output关键字。
上面这些关键点,如果不通过本文所给出的具体例子,是很难一下写出正确的调用代码的。所以看一下实测通过了的例子比单纯的文字说明要有用得多。
对动态调用存储过程感兴趣,但是又没有实际调用成功的朋友,可以仔细看一下本文给出的源码,总共没有几行,但是完整地展现了动态调用 ,特别是取回输出参数值的完整过程。、
网络斗地主游戏的完整设计与实现(三)入口存储过程详解,理解动态调用存储过程的原理相关推荐
- 网络斗地主游戏的完整设计与实现(二)系统的核心技术路线
引言 在前面的文章<网络斗地主游戏的完整设计与实现(一)项目的基本结构>介绍了项目的整体结构.接下来说明一下系统中用到的核心技术路线 项目的源码可在CSDN资源中下载 游戏界面的呈现 斗地 ...
- 网络斗地主游戏的完整设计与实现(一)项目的基本结构
引言 开发一个完整的游戏程序需要做的工作不少,本系列介绍一个较为完整的网络斗地主游戏的设计与实现过程. 项目的源码可在CSDN资源中下载 游戏基本界面 项目基本结构 项目分成两个主要部分,前台浏览器应 ...
- 网络斗地主游戏的完整设计与实现(四)游戏状态更新机制与心跳机制
引言 在前一篇文章中讲解了通过入口存储过程动态调用业务过程的原理.下面来说明如何实现游戏状态的更新. 项目的源码可在CSDN资源中下载 实现原理 由于http协议是无状态的请求响应式协议,用户可以主动 ...
- 网络斗地主游戏的完整设计与实现(五)随机发牌功能的实现
在扑克牌游戏中,生成一幅随机打乱的牌型,然后分发给玩家,是必须要实现的基本功能. 基本原理肯定是使用随机数,但是只有随机数达不到效果,因为是要随机地打乱顺序,而不是仅仅生成54个随机数.因为随机数有可 ...
- VC++ 网络台球游戏源代码完整
游戏的画面采用了十分精致的3D画面风格,玩家在游戏中能够体验到十分逼真的游戏体验 VC++6.0 网络台球游戏源代码完整.编译Billiards.dsw文件,在Debug目录下会生成Billiards ...
- 网页设计中的默认字体样式详解
浏览器默认的样式往往在不同的浏览器.不同的语言版本甚至不同的系统版本都有不同的设置,这就导致如 果直接利用默认样式的页面在各个浏览器下显示非常不一致,于是就有了类似YUI的reset之类用来尽量重写浏 ...
- 【原创-更新完毕】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载2
[原创]|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载1_zhuyi8120的博客-CSDN博客 [原创]|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载3_zhuyi8120的博客-C ...
- html5走格子游戏,JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解 发布时间:2020-09-26 20:42:24 来源:脚本之家 阅读:112 作者:krapnik 本文实例讲述了JS/HTML5游戏常 ...
- 【原创-更新完毕】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载1
[原创]|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载2_zhuyi8120的博客-CSDN博客 [原创]|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载3_zhuyi8120的博客-C ...
最新文章
- 突破性进展!上海光机所成果登上《Nature》封面!
- 0-1背包问题 题目:国王和金矿问题 描述:有一个国家发现了max_n座金矿,参与挖矿工人的总数是max_people人。每座金矿的黄金储量不同为一维数组gold[],需要参与挖掘的工人数也不同为一维
- mysql win10 优化设置_windows10如何优化?系统优化设置方法
- python程序的name的作用是什么_python 中__name__ = '__main__' 的作用,到底干嘛的?
- 在哪一瞬间,你意识到那个人不能深交?
- 清除html宏病毒,表格宏病毒怎么查杀 Excel宏病毒怎么清除?
- 达州2022年9大科技计划项目申报方向、周期、要求汇编大全
- c语言缺陷与陷阱,《C语言的缺陷与陷阱》读后总结
- 秒杀服务,秒杀系统设计与实现
- 腾讯微博qq说说备份导出工具_电竞和游戏火了,和它走得很近的腾讯微博却早已透心凉...
- Python编写csdn刷博客数量软件
- 全息投影是计算机技术吗,3D全息投影技术怎么应用在展厅的?
- 超好用的浏览器兼容性测试工具,赶紧收藏!
- 32岁的程序员被裁,java宿舍管理系统源码jsp
- JS盒子点击时跟随鼠标移动
- 联想拯救者 R720-15IKBN 加装固态以及重装Windows 10系统
- STM32传感器外设集--温湿度模块(DHT11)
- 负记账与剩余项目清账虚增借贷的问题
- linux 通过命令行打印本机IP
- html文档生成pdf离线文件,将Swagger2文档导出为HTML或markdown等格式离线阅读解析.pdf...
热门文章
- 软件设计linux,《Linux下手机软件的设计与实现》.doc
- java中的adt安装配置,Android SDK 2.3与Eclipse最新版开发环境搭建
- springboot 4大默认容器、指定运行容器
- 删除字符串的大写字母c语言,将字符串大写字母变小写 C语言 字符串中大小写字母转换...
- 基于asp.net的商业银行员工薪酬管理系统
- 红海云薪酬管理系统可以解决的算薪问题有哪些?
- MySQL 报错 ‘Variable ‘XXX‘ is a read only variable‘
- android Market 搜索APP
- c语言经典题目:求s = a + aa + aaa + aaaa + aa…a的值,其中a是一个数字
- 在vmware/virtualBox 虚拟机中使用adsl拨号上网