存储过程注释:
例如:
--=================================================--
-- Author: mocklystone
--Createtime: 2009-11-28
--Description: 添加用户信息
--UpdateRecord: 2009-11-28 mocklystone 添加参数 @usertype
2009-11-29 mocklystone 去除参数 @usertype
--=================================================--
ALTER procedure [dbo]. [Proc_UserInfo_Insert]
@username nchar ( 10),
@userpwd nchar ( 10),
@usertype int = 0
as
insert into Tab_UserInfo( UsrI_LoginName, UsrI_Loginpwd, UsrI_Type)
values ( @username, @userpwd, @usertype)
说明: Author: 创建人 createtime :创建时间 Description: 功能描述
updateRecord: 更新记录
注意点:
使用 Insert into 语句时请勿必使用如下格式:
insert into Tab_UserInfo( UsrI_LoginName, UsrI_Loginpwd, UsrI_Type)
values ( @username, @userpwd, @usertype)
不能使用如下格式:
insert into Tab_UserInfo values ( @username, @userpwd, @usertype)
即插入语句必须将表字段也一起写出来,以便日后表添加字段后,导致此存储过程出错。
2 、在 Tab_UserInfo 表中添加字段 UsrI_IsUsed ,字段为空,假设此字段为 int 类型,为 1 时表示可用,为 0 时表示不可用。
当我们在插入数据后就会存在三种情况,一种是 0 ,一种是 1 ,一种是 null
此时要查找不为 0 的值不能这样子写
Select * from Tab_userInfo where UsrI_IsUsed<>0 ,这样子的结果是只能找到 usrI_isUsed 为 1 的记录并无法找到值为 null 的记录,因为 UsrI_isUsed 是 int 类型,他只会对值为 int 类型的数据进行比对,而 null 不属于任何类型的值。它与 0 、空格、空字符串都不等同。
应写成这样:
Select * from Tab_userInfo where UsrI_IsUsed is null or usrI_IsUsed=1
3 、同上,添加完字段后应注意查看存储过程有没有兼容。在左边表中点击 Tab_UserInfo 右键查看依赖关系。这时候数据库会列出对这个表有操作的存储过程。重点查看有 insert into 的存储过程,如果没添加字段之前存储过程是这样写的话:
insert into Tab_UserInfo values ( @username, @userpwd)
那就会出现字段数目不匹配,所以这也是第一点所提到的对 insert into 这类存储过程的编写时应该注意的事项。
4 、字符串截断导致判断错误
经常我们在写程序时,对数据库进行操作时。在对存储过程参数进行定义大小时,需要经历一系列环节。
首先程序:
cmd.Parameters.Add("@UsrI_LoginName" , SqlDbType . NChar, 10);
cmd.Parameters["@UsrI_LoginName " ].Value = str_UserLoginName;
这边对用户名进行类型及大小定义,定义它的大小为 10 个字符。
然后数据库存储过程(同上):
@username nchar ( 10)
定义大小为 10 个字符
相应的表中 UsrI_LoginName 的大小也要定义为 10 个字符,如果这时表中此字段定义 5 个字符,这时候传进来的值就会被截断,造成错误。
或者这时表中此字段定义为 20 个字符,但却被存储过程及程序设定的大小所阻断,也会造成错误。所以请注意在表字段定义及存储过程参数大小定义还有程序参数大小定义这 3 个环节中注意保持一致。