当前位置: 首页 > 编程日记 > 正文

使用VS.NET2003编写存储过程


作者:未知   请作者速与本人联系

数据表定义了如何在数据库中存储数据,但没有说明如何存取数据。我们还需要了解读写记录以便从表中再次调用选定行和列的详细信息。开发人员通常会在其代码中编写一些特殊的查询语句,用于读写数据。这不仅会导致效率低下,还会带来安全性问题。在本应用中,所有数据存取工作都将通过 SQL Server 存储过程(stored procedures,有时称作“stored procs”或“sprocs”)来处理。使用存储过程可以提高解决方案的性能并使之更安全。此外,使用存储过程可以增加数据层的抽象级别,从而保护解决方案的其他部分不受小的数据布局和格式变化带来的影响。这样可使您的解决方案更可靠,更易于维护。

为什么不使用特殊的查询语句

我们经常会看到如下所示的文章和代码示例:

Private Function GetSomeData(ByVal ID As Integer) As SqlDataReader
Dim strSQL As String
strSQL = "SELECT * FROM MyTable WHERE ID=" & ID.ToString()
cd = New SqlCommand
With cd
.CommandText = strSQL
.CommandType = CommandType.Text
.Connection = cn
.Connection.Open()
Return .ExecuteReader(CommandBehavior.CloseConnection)
End With
End Function


上述代码不符合要求的原因有以下几个。首先,如果将 SQL 查询语句嵌套在代码中,那么只要数据层发生任何变化,都必须编辑并重新编译代码层。这样就会带来诸多不便。还可能会导致其他错误,而且通常会造成数据服务和代码之间的混乱。

其次,如果使用不经过输入验证的字符串连接 ("...WHERE ID=" & ID.ToString()),将可能使您的应用程序暴露在黑客的攻击之下。更重要的是,这样就会为恶意用户提供了在您的代码中添加其他 SQL 关键字的机会。例如,根据您的输入模式,恶意用户不仅可以输入 13 或 21 作为有效的表 ID,还可以输入 13; DELETE FROM USERS 或其他可能会带来危害的语句。完善的输入验证可以保护您的系统免受大多数 SQL 插入代码的攻击,所以最好将所有内置的 SQL 语句完全删除,使攻击者很难滥用您的应用程序数据。

最后,内置 SQL 语句的执行速度要比存储过程慢得多。创建存储过程并将其存储到数据库中时,SQL Server 会对其文本进行评估并以优化的形式进行存储,从而使之更容易在运行时为 SQL Server 所用。如果使用内置的特殊查询语句,就必须在每次运行该代码之前进行这种评估。对于那些供大量用户使用的应用程序而言,每分钟就可能需要对同一查询语句进行数百次评估。

相反,存储过程可以保持代码的简洁明了,可以提供额外的安全保护,并能提高解决方案的性能。这些都是摒弃内置查询语句而使用存储过程的原因。

将存储过程添加到 Visual Studio .NET 数据库项目中

使用 Visual Studio .NET 2003 创建存储过程非常简单。首先,您需要打开一个数据库项目。这一操作已在《使用VS.NET2003创建数据库图》中完成。然后,您可以使用代码模板创建存储过程,也可以针对 Server Explorer(服务器资源管理器)窗口中连接的数据库,使用 Visual Studio .NET 2003 直接编辑新的存储过程。本文重点介绍如何针对连接的数据库服务器直接编辑存储过程。稍后会介绍如何为以后的远程服务器安装生成所有结果脚本。

介绍使用 Visual Studio .NET 2003 编写存储过程的机制之前,还要重点强调一下与创建可靠的存储过程相关的几个一般问题。首先,最好将创建和执行存储过程的整个过程看作是多层应用程序模型的一个成熟成员。存储过程提供了一种对您的数据存取进行编程的方法。这样,您可以更好地控制整个解决方案并提高其效率。也就是说,应将存储过程集合看作是应用程序中一个独立的层。优秀的数据存取策略应允许存储过程作为独立的组件而存在。也就是说,存储过程层中需要具备安全性、错误处理以及其他构成优秀组件层的详细内容。更重要的是,应像在其他高级编程环境中那样访问 T-SQL 语言,而不是仅仅将其作为一种生成数据库查询的方式。

注意:现在,我怀疑有些读者可能在想他们并不打算对 SQL Server 进行编程,或者认为这项工作最好留给那些 DBA 们来完成。虽然具备数据库管理员经验会有所帮助,但并一定非要成为火箭科学家(这里指技艺高超的编程专家)才能很好地完成 SQL Server 编程工作。像其他语言一样,这种语言也需要花费一定的时间并通过一定的实践才能熟练掌握,在这一点上它与其他语言并没有太大的不同。如果您能够在 Microsoft Visual Basic? .NET 中编程,也就能够在 T-SQL 中编程。

使用 Visual Studio .NET 添加存储过程

下面详细介绍如何在 Visual Studio .NET 2003 中将存储过程添加到现有 SQL Server 数据库中。您需要使用服务器资源管理器打开一个新的存储过程模板,进行编辑,然后再将其保存到数据库中。下面是分步实现这一过程的示例:

·打开 Visual Studio .NET,然后打开一个现有的数据库项目(如本文前面所启动的项目)或启动一个新项目。
·在 Server Explorer(服务器资源管理器)中,展开 Data Connections(数据连接)树,找到您要使用的数据库 (DotNetKB),然后在 Stored Procedures(存储过程)节点上单击鼠标右键,打开上下文相关菜单。
·从上下文相关菜单中选择 New Stored Procedure(新建存储过程),在 Visual Studio .NET 编辑器空间中打开一个存储过程模板。现在,可以键入内容了。
·完成编辑后,只需关闭编辑器中正在编辑的页面,Visual Studio .NET 将使用存储过程的名称将该项内容保存到数据库中。如果键入的内容有误,编辑器会向您报告这些错误,您可以在保存存储过程之前修正这些错误。

下面是存储过程的一个简单示例,它返回一个主题列表。

CREATE PROCEDURE TopicsGetList
AS
SET NOCOUNT ON -- 不返回受影响行的值
SELECT 
ID,
Title,
Description
FROM 
Topics
ORDER BY 
Title
RETURN @@ERROR


在本示例中,有几点需要指出。首先,请注意 SET NOCOUNT ON 行。它告诉 SQL Server 停止为该查询计算受影响的行数,并停止向调用函数返回该值。这是一项不必要的额外工作。其次,结尾处的 RETURN @@ERROR 一行很重要。此行代码返回 SQL Server 中发生的错误的整数值。您可以在调用例程中使用此代码完成其他诊断和错误处理操作。您现在并不需要执行任何操作,但它们是创建存储过程时应该遵循的两个好习惯。

下面是一个更复杂的存储过程。此过程用于从数据库中检索单条主题记录。您会发现一些附加项,包括输入参数、返回特定值的输出参数,以及检查输入参数并在需要时返回错误的某些程序代码。

CREATE PROCEDURE TopicsGetItem
(
@AdminCode char(3),
@ID int,
@Title varchar(30) OUTPUT,
@Description varchar(500) OUTPUT
)
AS
SET NOCOUNT ON -- 不返回受影响行的值
-- 确保是一个 Admin 用户
IF @AdminCode<>'adm'
BEGIN
RETURN 100 -- 无效 admin 错误
END
-- 检查记录是否存在
IF (SELECT Count(ID) FROM Topics WHERE ID=@ID)=0
BEGIN
RETURN 101 --- 无效 ID 代码
END
-- 继续执行并返回该记录
SELECT 
@Title=Title, 
@Description=Description
FROM 
Topics
WHERE 
ID=@ID
-- 返回错误,如果成功则返回 0
RETURN @@ERROR


在本示例中,还有几点需要指出。首先,您会在存储过程顶端看到一个参数列表。除前两个参数外,其他参数均被标记为 OUTPUT 参数。这些参数用于返回选定记录的值。使用一条记录的返回值要比返回带有所有字段的记录集合更为高效。

其次,您会发现用于检查 @AdminCode 参数值的 T-SQL 数据块,以确保传递正确的代码。如果传递的代码不正确,则传递返回代码 100 并停止执行该过程。再其次,您会发现检查 @ID 参数,以确保其代表一条现有记录。如果不是现有记录,则传送返回代码 101 并终止执行。最后,如果输入变量都有效,存储过程将尝试选择记录并返回相应的值。如果此时发生任何错误,将由该过程的最后一行代码进行处理。

注意:通常情况下,最好将自定义错误代码及其含义保存在数据库中的一个单独的表格中,或保存在解决方案可以访问的文本文件中。这样就可以轻松更新这些错误代码,并与解决方案中的其他子系统共享。因为这只是一个短小的示例,其中只使用了两个错误代码,所以我决定创建一个包含大量代码和消息的文档,以供其他子系统参考。

该解决方案中包含的存储过程超过 25 个。本文仅举一例进行说明,其他代码可以通过本文开始处的链接进行下载。最后这个示例使用一个自定义的内置标量函数。

使用自定义标量函数

有时,单独一个存储过程不足以解决问题。例如,我们的用户方案中就有一个方案要求列出某个问题的解答数目。解决此问题的方法之一是生成一个对问题的解答进行计数的子查询。另外一种方法是生成一个自定义函数,返回标量值并将其包含在问题查询中。这种方法还有一个好处,那就是我们可以在其他存储过程中再次使用该标量函数。

添加自定义函数的操作类似于添加存储过程。在 Server Explorer(服务器资源管理器)树中,在选定数据库的 Functions(函数)节点上单击鼠标右键,然后从上下文相关菜单中选择 New Scalar-Valued Function(新建标量值函数)。然后在编辑器中编辑该文档,并像保存存储过程那样保存该文档。

以下是自定义函数的代码:

CREATE FUNCTION dbo.fn_QuestionsGetResponseCount
(
@ID int
)
RETURNS int
AS
BEGIN
DECLARE @ResponseCount int
Set @ResponseCount = 
(
SELECT 
COUNT(Responses.ID) 
FROM 
Responses
WHERE
Responses.QuestionID=@ID
)
RETURN @ResponseCount
END


以下是使用自定义函数的存储过程:

CREATE PROCEDURE QuestionsGetCountWithNoResponses
(
@Total int OUTPUT
)
AS
SET NOCOUNT ON -- 不返回受影响行的值
SELECT 
@Total=Count(ID)
FROM 
Questions
WHERE 
dbo.fn_QuestionsGetResponseCount(Questions.ID)=0
RETURN @@ERROR

相关文章:

谈Linux的安全设置

如今系统的安全变的越来越重要了&#xff0c;这里我想把我平时比较常使用的一些linux下的基本的安全措施写出来和大家探讨一下&#xff0c;让我们的Linux系统变得可靠。 1、BIOS的安全设置 这是最基本的了&#xff0c;也是最简单的了。一定要给你的BIOS设置密码&#…

亮风台提出用完全可训练的图匹配方法,优于最新SOTA | CVPR 2020

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 6月14日-19日&#xff0c;CVPR 2020在线上举行&#xff0c;据了解&#xff0c;本届大会共收到6656篇投稿&#xff0c;接收论文1470篇&#xff0c;录用率约22%&#xff0c;低于ICCV 2019论文录用率&#xff08;25%&…

数组与纠结的排序篇

数组之纠结的排序 1.数组是什么&#xff1f; 数组&#xff1a;所谓数组&#xff0c;就是相同数据类型的元素按一定顺序排列的集合&#xff0c;就是把有限个类型相同的变量用一个名字命名&#xff0c;然后用编号区分他们的变量的集合&#xff0c;这个名字称为数组名&#xff0c;…

ASP.NET结合COM组件发送Email

在开发电子邮件发送程序的时候&#xff0c;我们经常需要使用到相应的组件&#xff0c;其实不需要第三方的组件&#xff08;例如&#xff1a;Jmail&#xff09;照常可以做到发送Email的功能。 在系统目录&#xff08;如c:/winnt或c:/windows&#xff09;的system32子目录中可以找…

卡巴循环30天不限次数循环试用工具

本文需评论之后方可查看&#xff01; echo off title 卡巴循环30天不限次数循环试用工具 echo off echo 卡巴循环30天不限次数循环试用工具 echo. echo echo 卡巴斯基6/7/8试用过期时清除系统中使用痕迹&#xff0c;就象新系统重新安装卡巴一样 echo 1、在屏幕右下角红V卡巴图…

微软CEO纳德拉对话沈向洋:那些未来可期的计算机视觉研究与应用

编者按&#xff1a;6月16日&#xff0c;CVPR 2020 大会以全球连线的形式如期开幕。在大会的首场主题演讲中&#xff0c;微软公司 CEO 萨提亚纳德拉与微软公司前执行副总裁沈向洋进行了一场精彩的炉边对谈&#xff0c;分享了对计算机视觉、人工智能研究与应用前景的思考与展望。…

SoapUI进行REST请求,POST方法提交到数据库的数据乱码问题

一开始以为要把json字符串的key和value一个一个的加进去&#xff0c;结果总是报 300&#xff0c;参数错误&#xff0c;后来才发现&#xff08;https://www.joecolantonio.com/2013/08/31/soapui-how-to-post-json-to-a-rest-service-2/&#xff09;可以直接在下面粘贴就好了&am…

网站信息统计的简单实现过程

作者&#xff1a; pcskySQL语句如下&#xff1a; SELECT DD.SumHits, AA.CountArt, CC.WeekUpdate, BB.RegUserNumFROM(SELECT COUNT(newsid) AS CountArt FROM article) AA,(SELECT COUNT(id) AS RegUserNum FROM Admin) BB,(SELECT COUNT(newsid) AS WeekUpdate FROM(articl…

谈谈C#中类成员的执行顺序.

今天我们来谈谈C#中子类和父类中静态成员以及构造函数的执行顺序&#xff0c;这个地方向来是初学C#的人比较迷惑的地方&#xff0c;也是各大公司最喜欢拿来出面试题的地方。 下面我们分情况来分析。 1. 普通构造函数和静态构造函数的执行顺序。 对于单个的类&#xff0c;它的静…

AI 重塑 IT的 5 种方式

作者 | Stephanie Overby译者 | 火火酱&#xff0c;责编 | Carol封图 | CSDN 下载于视觉中国Gartner最新的人工智能&#xff08;AI&#xff09;hype cycle报告指出&#xff0c;AI在未来五年中CIO议程中的排名十分靠前&#xff0c;对潜在业务转型具有重要影响。然而&#xff0c;…

[原创]Gerrit中文乱码问题解决方案分享

应开发同事的要求,部署了GitlabGerritJenkins的持续集成环境. 但是发现了一个问题,Gerrit登陆后有中文乱码出现. 具体情况如下: (1)Git代码中的中文乱码处理: 为妥善解决中文编码的问题&#xff0c;对所有git repository做如下约定&#xff1a;所有文本文件都必须存储成utf8编码…

UVA 10700 Camel trading

UVA_10700我们可以猜到最大值一定是先算和后算积&#xff0c;最小值一定是先算积后算和,因为a*bc<a*(bc)。此外&#xff0c;这个题目数据有可能比较大&#xff0c;所以要采用long long int或者double来处理数据。 #include<stdio.h>#include<string.h>#include&…

在ASP.NET中操作文件的例子

利用SYSTEM.IO 名空间中的STREAMWRITER,STREAMREADER及FILE类,完成文件读、写、删除的操作。 -------------------------------------------------------------------------------- 1、写文件 writefile.aspx <% Import Namespace"System.IO" %> 引…

云原生如此重要,可惜80%的人都不知道

文 | Aholiab责编 | Carol封图 | CSDN 下载自视觉中国2020年&#xff0c;一场疫情给中国企业带来了一次「被动数字化升级」&#xff0c;很多企业第一次认识到了信息化的重要性。今天&#xff0c;数字经济已无处不在&#xff0c;根据中国信息化百人会的研究报告显示&#xff0c;…

CentOS 7 yum 安装 MySQL5.7

为什么80%的码农都做不了架构师&#xff1f;>>> 0、环境 本文操作系统: CentOS 7.2.1511 x86_64 MySQL 版本: 5.7.13 1、下载 MySQL 官方的 Yum Repository 从 MySQL 官网选取合适的 MySQL 版本&#xff0c;获取下载地址。 然后使用 wget 下载&#xff1a; [rootce…

万字长文带你入门 GCN

来源 | 阿泽的学习笔记&#xff08;ID: aze_learning&#xff09;Convolutional Neural NetworkCNN 在图像识别等任务中具有重要作用&#xff0c;主要是因为 CNN 利用了图片在其域中的平移不变性。由于图结构不存在平移不变性&#xff0c;所以 CNN 无法直接在图上进行卷积。1.1…

VS.Net中程序集的Debug版本和Release版本的区别

作者&#xff1a;未知 请作者速与本人联系前几天看到豆腐的文章介绍如何知道程序集是Debug版还是Release版&#xff0c;之前只知道某些软件从功能上有企业版、标准版之分&#xff0c;却从不知道.Net程序集还有Debug和Release之区别&#xff0c;真是惭愧学了这一年C#。然后在博…

《CLR via C#》笔记——CLR的执行模型

一&#xff0e;将源代码编译成托管代码1&#xff0c; CLR&#xff08;Common Language Runtime&#xff09;公共语言运行时是一个可由多种语言使用的“运行时”&#xff0c;CLR的核心功能&#xff08;比如内存管理&#xff0c;程序集加载&#xff0c;安全性&#xff0c;异常处理…

telnet时显示:允许更多到 telnet 服务器的连接。请稍候再试

telnet时显示&#xff1a;允许更多到 telnet 服务器的连接。请稍候再试 解决办法:windows自带telnet服务器默认的最大连接数为2&#xff0c;要想修改该设置&#xff0c;可以在命令行键入tlntadmn config maxconn要设置的连接数。最大连接数是指同一时刻内客户连接服务器的最大数…

Asp.net支持的最大上传文件大小

Asp.net的默认的最大可以上载的文件是4M,可以在web.config中配置.配置 ASP.NET HTTP 运行库设置。该节可以在计算机、站点、应用程序和子目录级别声明。 <configuration> <system.web> <httpRuntime><httpRuntime useFullyQualifiedRedirectUrl&q…

ASP.NET--Menu控件

http://www.meituan.com/r/i13110281 Menu控件提供静态和动态混合的菜单功能。在向页面添加这个控件的时候&#xff0c;开发人员可以选择将它设置为一个完全动态的菜单&#xff0c;以便整个站点的导航结构都可以显示在菜单中&#xff0c;类似于Windows的Start菜单。另一种选择是…

AI进军服装零售产业:微软小冰与特步推出定制化服装设计生产及零售平台

&#xff08;6月22日&#xff0c;北京&#xff09; 今日&#xff0c;体育用品企业特步集团与微软小冰宣布达成合作&#xff0c;依托微软小冰人工智能创造技术共同推出的定制化服装设计生产及零售平台即将上线。双方携手为消费者提供定制化图案设计&#xff0c;满足每个消费者的…

PHP如何通过Http Post请求发送Json对象数据?

因项目的需要&#xff0c;PHP调用第三方 Java/.Net 写好的 Restful Api&#xff0c;其中有些接口&#xff0c;需要 在发送 POST 请求时&#xff0c;传入对象。 Http中传输对象&#xff0c;最好的表现形式莫过于JSON字符串了&#xff0c;但是作为参数的接收方&#xff0c;又是需…

字符串截取固定长度的方法

这个函数也没有什么特别之处&#xff0c;就是可以截取一定长度的字符串&#xff0c;可能小特点就是len是字节&#xff0c;解决了汉字与英文字节不一样导致直接截取到的长度不一样的问题&#xff0c; #region 字符串截取函数 public static string CutString(string inputStrin…

hql中常用函數介紹二

为什么80%的码农都做不了架构师&#xff1f;>>> 四. ISNULL 函数和 NULLIF 函数SQL Server里的 ISNULL 与 ASP 中的 IsNull不同&#xff0c;SQL Server 中有两个参数&#xff0c;语法&#xff1a; ISNULL(check_expression, replacement_value) check_expression 与…

技术直播:讲一个Python编写监控程序的小故事

今年疫情“黑天鹅”事件改变了大家的生活。相信大家都经历过&#xff0c;每天早晨起床第一件事&#xff0c;就是查看数据。这些数据不仅仅是人们对活着的渴望&#xff0c;也是在建立对战胜疫情的决心。那么技术人怎么能通过自己所学的去进行数据监控呢&#xff1f;今天CSDN邀请…

ios开发之系统信息

1. //手机系统版本 self.phoneVersion [NSString stringWithFormat:"iOS %",[[UIDevice currentDevice] systemVersion]]; 2. // 获取当前设备可用内存(单位&#xff1a;MB&#xff09; - (double)availableMemory { vm_statistics_data_t vmStats; mach_msg_type_n…

混合时空图卷积网络:利用导航数据改进交通预测效果 | KDD 2020

作者 | 高德机器学习团队出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;引言时空预测&#xff08;spatio-temporal forecasting&#xff09;在天气预报、运输规划等领域有着重要的应用价值。交通预测作为一种典型的时空预测问题&#xff0c;具有较高的挑战性。日常通…

MS SQL Server和MySQL区别

- 最近在做MS SQL Server转换成MySQL的工作&#xff0c;总结了点经验&#xff0c;跟大家分享一下。同时这些也会在不断更新。也希望大家补充。   1 MySQL支持enum,和set类型&#xff0c;SQL Server不支持 2 MySQL不支持nchar,nvarchar,ntext类型 3 MySQL的递增语句是AUTO_INC…

DataGrid在分页状态下删除纪录的问题

在使用DataGrid分页的时候&#xff0c;正常情况下&#xff0c;绑定数据库列表纪录时会自动产生分页的效果&#xff0c;然而我发觉在删除纪录的时候总会发生"无效的 CurrentPageIndex 值。它必须大于等于 0 且小于 PageCount。"的异常&#xff0c;其实解决这个问题很简…