1、oracle存储过程以及asp.net中调用存储过程,实现一个简单的登录功能,只是作为学习的,所以处理可能不太合理。
① 在pl/sql developer中编写存储过程
新建procedures,一个简单的登录检查存储过程代码如下:
create or replace procedure user_login(sname in nvarchar2 ,spassword in nvarchar2, returnvalue out number)
is --变量声明
rname nvarchar2(20);
rpassword nvarchar2(50);
begin
returnvalue :=0; --赋初值
select username into rname from userinfo where username=sname;
if rname is not null then
returnvalue:=1;--用户名存在
select userpassword into rpassword from userinfo where username=sname and userpassword=spassword;
if rpassword is not null then
returnvalue:=2;--登陆成功
else returnvalue:=1;--用户名存在,密码不正确
return ;
end if;
else returnvalue:=0;--用户不存在
end if;
exception
when no_data_found then
dbms_output.put_line('没有找到数据');
end;
② 在pl/sql developer的sql窗口中调用存储过程
declare --变量声明
returnvalue number(10);
begin
user_login('faith','faith',returnvalue);
if returnvalue=0 then
dbms_output.put_line('不存在此用户');
elsif returnvalue=1 then
dbms_output.put_line('存在用户,但密码不正确');
else
dbms_output.put_line('登录成功!!!');
end if;
end;
③ 在vs2012中调用存储过程
在oraclehelper.cs文件中:
public static void irunproc(string procname, oracleparameter[] paras)
{
oracleconnection conn=new oracleconnection(oraclehelper.strconn);
if (conn.state == connectionstate.closed)
{
conn.open();
}
oraclecommand cmd = new oraclecommand(procname, conn);
cmd.commandtype = commandtype.storedprocedure;
if (paras != null)
{
for (int i = 0; i
{
oracleparameter parameter = paras[i];
cmd.parameters.add(parameter);
}
}
int result = cmd.executenonquery();
cmd.executenonquery();
}
dal层的webtestdal.cs文件中
public static int loginbyproc(string name,string password,string procname)
{
oracleparameter[] parameters ={
new oracleparameter(sname, oracletype.nvarchar, 20),
new oracleparameter(spassword, oracletype.nvarchar, 50),
new oracleparameter(returnvalue, oracletype.number, 10)
};
parameters[0].value = name;
parameters[1].value = password;
//parameters[2].value = 0;
parameters[0].direction = parameterdirection.input;
parameters[1].direction = parameterdirection.input;
parameters[2].direction = parameterdirection.output;
try
{
oraclehelper.irunproc(procname, parameters);
int i = int.parse(parameters[2].value.tostring());
return i;
}
catch (exception e)
{
throw e;
}
}
在bll层的webtestbll.cs文件中
public static int loginbyproc(string name, string password, string procname)
{
return webtestdal.loginbyproc(name, password, procname);
}
在页面代码的登录按钮事件中
protected void btnsubmit_click(object sender, eventargs e)
{
string name = this.txtname.text.trim();
string password = this.txtpassword.text.trim();
//调用存储过程,判断是否登录成功
if (webtestbll.loginbyproc(name, password, user_login)==2)//存储过程输出2表示登录成功
{//登录成功,保存用户名和密码的cookie
httpcookie mycookie = new httpcookie(logincookie);
mycookie.values.add(cname, name);
mycookie.values.add(cpassword, password);
mycookie.expires = datetime.now.addhours(4);//cookie的生命期
response.appendcookie(mycookie);
response.redirect(userinfo.aspx);
}
else if (webtestbll.loginbyproc(name, password, user_login) == 1)
{
// response.write();
registerclientscriptblock(msg, );
}
else
registerclientscriptblock(msg, );
}
2、登录之后,传递cookie值
先获取登录界面的cookie值(代码如上)
将登录页面的cookie值传给跳转页面
protected void page_load(object sender, eventargs e)
{
if (!ispostback)
{
datatable dt = webtestbll.getall();
userinfogrid.datasource = dt;
if (dt != null)
userinfogrid.databind();
httpcookie mycookie = null;
if (request.cookies.get(logincookie) != null)
{//当用户登录了时,获取页面传来的cookie值
mycookie = request.cookies.get(logincookie);
this.txtloginname.text = mycookie.values[cname].tostring();
this.txtloginpassword.text = mycookie.values[cpassword].tostring();
}
else
{//cookie过期或者没登录
response.redirect(userlogin.aspx?errormsg=您还没登陆,请先登陆!);
}
}
}
