存储过程即存储在DBMS中的SQL语句,使用存储过程好处多多,模块化设计、提高性能、减少网络流量如此云云。最近有时间,自己琢磨着写了个ASP.NET调用存储过程的demo,其实网上已有很多相关的代码,这里我只是按自己的思路改动下。整个demo是相当的简单,用AJAX验证用户登陆。
1)首先我们需要建一张用户表
Id是主键,只验证登录,有UserName和Password就足够了。
2)在表中任意写入几条数据
3)写个简单的存储过程
CREATE PROCEDURE P_Login
@userName varchar(50),
@pwd varchar(50),
@count int output
AS
set @count =(select count(*) from T_Users where UserName=@userName and Password=@pwd)
存储过程的名字是P_Login,有三个参数,@userName和@pwd是输入参数,即用户名和密码,@count是输出参数,为返回查询的记录数。在程序中对输入参数和输出参数的处理稍有区别,要特别注意。
4)在新建的ASP.NET项目中,新建一个一般处理程序,取名LoginHandler.ashx(名字随意),完整代码如下:
public class LoginHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string userName=context.Request["userName"]; //获取客户端传来的 用户名
string pwd=context.Request["pwd"]; //获取客户端传来的密码
int count=0; //执行存储过程返回的记录数存在这个变量
string connStr = ConfigurationManager.ConnectionStrings["UsersConnectionString"].ToString(); //获取连接字符串
using (SqlConnection conn=new SqlConnection(connStr)) //新建一个数据库连接
{
conn.Open();
using (SqlCommand comm=new SqlCommand("P_Login",conn)) //新建一个 SqlCommand, P_Login为存储过程名,conn为数据库连接
{
comm.CommandType = CommandType.StoredProcedure; //指定命令的类型为存储过程
SqlParameter parUserName = new SqlParameter("@userName", userName); //new一个输入参数传用户名
SqlParameter parPwd=new SqlParameter("@pwd",pwd); //new一个输入参数传密码
SqlParameter parCount = new SqlParameter("@count",SqlDbType.Int); //new一个输出参数接收执行存储过程后返回的记录数
//将三个参数都添加到命令
comm.Parameters.Add(parUserName);
comm.Parameters.Add(parPwd);
comm.Parameters.Add(parCount);
comm.Parameters["@count"].Direction = ParameterDirection.Output; //对输出参数做特殊处理,即设置参数方向Direction
comm.ExecuteNonQuery(); //执行这个存储过程
count = (int)comm.Parameters["@count"].Value; //执行的结果赋给count
context.Response.Write(count); //最后向客户端输出count
}
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
4)登录页面
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="../Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script type="text/javascript">
$("document").ready(function () {
$("#btnLogin").click(function () { //登录按钮的click事件
var userName = $("#txtUserName").val(); //获取用户名
var pwd = $("#txtPwd").val(); //获取密码
if (userName == '' || pwd == '') { //若有为空的则放回
alert("用户名或密码不能为空!");
}
//post请求LoginHandler.ashx,传入参数 userName和 pwd ,这里要注意一般处理程序所在的路径,不要犯低级错误
//textStatus是 一般处理程序返回的状态,为“ success ”说明成功,data是返回的数据,这里应该是存储过程执行的结果
$.post("../LoginHandler.ashx", { "userName": userName, "pwd": pwd }, function (data, textStatus) {
if (textStatus == "success") {
if (data > 0) {
alert("登录成功!");
}
else alert("登录失败!");
}
});
});
});
</script>
</head>
<body>
用户名:<input id="txtUserName" type="text" /><br />
密 码:<input id="txtPwd" type="text" /><br />
<input id="btnLogin" type="button" value="确定" />
</body>
</html>
5)执行结果如下
很简单,需要注意的是输出参数需要设置参数的方向为输出,“方向”是我意会的不一定准确,差不多是那个意思。