三层登录验证出错急高手看看。。。。。是不是这样。。。
我要求的目地是:点登录先看用名和密码正不正确。。。并且存不存在这个ID。。。。。。还要加入个SESSion 记录用户名要怎么样写,,,。。。。。。运行后SQL语句是这样select count(1) from [adminuser] where [Id]= @Id
提示错误信息为
消息 137,级别 15,状态 2,第 1 行
必须声明标量变量 "@Id"。
protected void but_log_Click(object sender, EventArgs e)
{
Model.adminuser mo = new Model.adminuser();
BLL.adminuser bl = new BLL.adminuser();
mo.username = TB_username.Text;
string PWD = StringOperation.StringOperation.Encrypt(TB_userpwd.Text, 1);
mo.userpwd = PWD;
List<Model.adminuser> lis = new BLL.adminuser().GetList(null, "Id='" + mo.Id + "'", null);
mo.username = Convert.ToString(lis);
bool userID = new BLL.adminuser().Exists(mo.Id);
if(userID==true)
//运行到这时user==false的
{
Response.Redirect("user moon_upDATA_Del.aspx");
}
else
{
Response.Write("登录实败");
}
BLL层是这样:如果要查有没这个记录这个方法怎么用? 就是在点注册是有没有这个用户名。。有相同用户名不可以注册
[color=#FF9900]这个方法怎么用啊?查有没有这条记录。。
public bool Exists(int Id)
{
return dal.Exists(Id);
}[/color]
using System;
using System.Data;
using Model;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Caching;
using System.Net;
using SQLServerDAL;
namespace BLL
{
/// <summary>
/// 业务逻辑类 adminuser
/// </summary>
public class adminuser
{
private readonly SQLServerDAL.adminuser dal = new SQLServerDAL.adminuser();
public adminuser()
{ }
#region 成员方法
/// <summary>
/// 增加一条数据
/// </summary>
public int Add(Model.adminuser model)
{
return dal.Add(model);
}
/// <summary>
/// 增加多条数据
/// </summary>
public void Add(List<Model.adminuser> l)
{
foreach (Model.adminuser model in l)
dal.Add(model);
}
/// <summary>
/// 更新一条数据
/// </summary>
public bool Update(Model.adminuser model)
{
return dal.Update(model);
}
/// <summary>
/// 更新多条数据
/// </summary>
public void Update(List<Model.adminuser> l)
{
foreach (Model.adminuser model in l)
dal.Update(model);
}
/// <summary>
/// 删除一条数据
/// </summary>
public bool Delete(int Id)
{
return dal.Delete(Id);
}
/// <summary>
/// 删除多条数据
/// </summary>
public void Delete(List<int> l)
{
foreach (int Id in l)
dal.Delete(Id);
}
/// <summary>
/// 是否存在该记录
/// </summary>
public bool Exists(int Id)
{
return dal.Exists(Id);
}
/// <summary>
/// 得到一个对象实体
/// </summary>
public Model.adminuser GetModel(int Id)
{
return dal.GetModel(Id);
}
//public Model.adminuser GetModel(Model.adminuser model)
//{
// return dal.GetModel(model);
//}
/// <summary>
/// 得到数据总条数
/// </summary>
public int GetCount()
{
DataSet ds = dal.GetDataSet("count(*)", null, null);
return Convert.ToInt32(ds.Tables[0].Rows[0][0]);
}
/// <summary>
/// 获得泛型数据列表,不建议直接使用此方法,请根据业务逻辑重写
/// </summary>
public List<Model.adminuser> GetList(string strWhat, string strWhere, string strOrderby)
{
return dal.GetList(strWhat, strWhere, strOrderby) as List<Model.adminuser>;
}
/// <summary>
/// 分页获取泛型数据列表,不建议直接使用此方法,请根据业务逻辑重写
/// </summary>
public List<Model.adminuser> GetList(int pageSize, int pageIndex, string fldSort, bool Sort, string strCondition, out int pageCount, out int Counts)
{
return dal.GetList(pageSize, pageIndex, fldSort, Sort, strCondition, out pageCount, out Counts) as List<Model.adminuser>;
}
#endregion
#region 扩展方法
/// <summary>
/// 获得全部泛型数据列表
/// </summary>
public List<Model.adminuser> GetAllList()
{
return GetList(null, null, null);
}
}
这是前台
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
<style type="text/css">
.style1
{
width: 614px;
height: 56px;
}
.style2
{
height: 15px;
}
.style3
{
height: 23px;
}
.style4
{
height: 30px;
}
.style5
{
height: 15px;
width: 139px;
}
.style6
{
height: 23px;
width: 139px;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div align="center" style="height: 381px">
<table class="style1">
<tr>
<td class="style5">
用户名:</td>
<td class="style2">
<asp:TextBox ID="TB_username" runat="server" Width="122px"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
ControlToValidate="TB_username">用户名不能为空</asp:RequiredFieldValidator>
<asp:Label ID="LB_Exists" runat="server" Text="查看用户有没有注册"></asp:Label>
</td>
</tr>
<tr>
<td class="style6">
密 码:</td>
<td class="style3">
<asp:TextBox ID="TB_userpwd" runat="server" TextMode="Password" Width="132px"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server"
ControlToValidate="TB_userpwd" ErrorMessage="请输入密码"></asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td class="style4" colspan="2">
<asp:Button ID="btu_dg" runat="server" onclick="btu_dg_Click"
Text="注册" />
<asp:Button ID="but_log" runat="server" onclick="but_log_Click" Text="登录" />
<asp:Label ID="LB_ID" runat="server" Text="LB_ID" Visible="False"></asp:Label>
</td>
</tr>
</table>
<br />
</div>
</form>
</body>
</html>
--------------------编程问答-------------------- SqlParameter[] Para= new SqlParameter[] { new SqlParameter("@id", SqlDbType.Int, 4) };
Para[0].Value = ""; --------------------编程问答-------------------- DAL文件还没贴出来,贴出来看看 --------------------编程问答-------------------- 路过了,自学出家的俺还没弄过3层的东西。自己给分了2层…… --------------------编程问答-------------------- DAL层
using System;
using System.Data;
using System.Text;
using System.Data.SqlClient;
using DBUtility;
using System.Collections;
using System.Collections.Generic;
namespace SQLServerDAL
{
/// <summary>
/// 数据访问类 adminuser
/// </summary>
public class adminuser
{
public adminuser()
{ }
#region 成员方法
/// <summary>
/// 增加一条数据
/// </summary>
public int Add(Model.adminuser model)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("insert into [adminuser](");
strSql.Append("[username],[userpwd],[create_time])");
strSql.Append(" values (");
strSql.Append("@username,@userpwd,@create_time)");
strSql.Append(";select @@Identity");
SqlParameter[] parameters = {
new SqlParameter("@username", SqlDbType.NVarChar,50),
new SqlParameter("@userpwd", SqlDbType.NVarChar,50),
new SqlParameter("@create_time", SqlDbType.DateTime)
};
parameters[0].Value = model.username;
parameters[1].Value = model.userpwd;
if (model.create_time != DateTime.MinValue)
parameters[2].Value = model.create_time;
else
parameters[2].Value = DBNull.Value;
return SqlHelper.GetInt(SqlHelper.GetSingle(SqlHelper.LocalSqlServer, strSql.ToString(), parameters));
}
/// <summary>
/// 更新一条数据
/// </summary>
public bool Update(Model.adminuser model)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("update [adminuser] set ");
strSql.Append("[username]=@username,");
strSql.Append("[userpwd]=@userpwd,");
strSql.Append("[create_time]=@create_time");
strSql.Append(" where [Id]=@Id");
SqlParameter[] parameters = {
new SqlParameter("@Id", SqlDbType.Int),
new SqlParameter("@username", SqlDbType.NVarChar,50),
new SqlParameter("@userpwd", SqlDbType.NVarChar,50),
new SqlParameter("@create_time", SqlDbType.DateTime)
};
parameters[0].Value = model.Id;
parameters[1].Value = model.username;
parameters[2].Value = model.userpwd;
if (model.create_time != DateTime.MinValue)
parameters[3].Value = model.create_time;
else
parameters[3].Value = DBNull.Value;
return SqlHelper.ExecuteSql(SqlHelper.LocalSqlServer, strSql.ToString(), parameters) > 0;
}
/// <summary>
/// 删除一条数据
/// </summary>
public bool Delete(int Id)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("delete [adminuser] ");
strSql.Append(" where [Id]=@Id");
SqlParameter[] parameters = {
new SqlParameter("@Id", SqlDbType.Int)};
parameters[0].Value = Id;
return SqlHelper.ExecuteSql(SqlHelper.LocalSqlServer, strSql.ToString(), parameters) > 0;
}
/// <summary>
/// 得到最大ID
/// </summary>
public int GetMaxId()
{
return SqlHelper.GetMaxID(SqlHelper.LocalSqlServer, "[Id]", "[adminuser]");
}
/// <summary>
/// 是否存在该记录
/// </summary>
public bool Exists(int Id)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select count(1) from [adminuser]");
strSql.Append(" where [Id]= @Id");
SqlParameter[] parameters = {
new SqlParameter("@Id", SqlDbType.Int)};
parameters[0].Value = Id;
return SqlHelper.Exists(SqlHelper.LocalSqlServer, strSql.ToString(), parameters);
}
//public bool Exists(Model.adminuser model)
//{
// StringBuilder strSql = new StringBuilder();
// strSql.Append("select count(1) from [adminuser]");
// strSql.Append(" where [Id]= @Id");
// SqlParameter[] parameters = {
// new SqlParameter("@Id", SqlDbType.Int)};
// parameters[0].Value = Id;
// return SqlHelper.Exists(SqlHelper.LocalSqlServer, strSql.ToString(), parameters,model);
// //throw new NotImplementedException();
//}
/// <summary>
/// 得到一个对象实体
/// </summary>
public Model.adminuser GetModel(int Id)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select * from [adminuser] ");
strSql.Append(" where [Id]=@Id");
SqlParameter[] parameters = {
new SqlParameter("@Id", SqlDbType.Int)};
parameters[0].Value = Id;
DataSet ds = SqlHelper.Query(SqlHelper.LocalSqlServer, strSql.ToString(), parameters);
if (ds.Tables[0].Rows.Count > 0)
{
DataRow r = ds.Tables[0].Rows[0];
return GetModel(r);
}
else
{
return null;
}
}
/// <summary>
/// 获取数据集,建议只在多表联查时使用
/// </summary>
public DataSet GetDataSet(string strSql)
{
return SqlHelper.Query(SqlHelper.LocalSqlServer, strSql);
}
/// <summary>
/// 获取泛型数据列表,建议只在多表联查时使用
/// </summary>
public IList<Model.adminuser> GetList(string strSql)
{
return GetList(GetDataSet(strSql));
}
/// <summary>
/// 获取数据集,在单表查询时使用
/// </summary>
public DataSet GetDataSet(string strWhat, string strWhere, string strOrderby)
{
if (string.IsNullOrEmpty(strWhat))
strWhat = "*";
StringBuilder strSql = new StringBuilder("select " + strWhat + " from [adminuser]");
if (!string.IsNullOrEmpty(strWhere))
strSql.Append(" where " + strWhere);
if (!string.IsNullOrEmpty(strOrderby))
strSql.Append(" order by " + strOrderby);
return SqlHelper.Query(SqlHelper.LocalSqlServer, strSql.ToString());
}
/// <summary>
/// 获取泛型数据列表,在单表查询时使用
/// </summary>
public IList<Model.adminuser> GetList(string strWhat, string strWhere, string strOrderby)
{
return GetList(GetDataSet(strWhat, strWhere, strOrderby));
}
/// <summary>
/// 分页获取泛型数据列表
/// </summary>
public IList<Model.adminuser> GetList(int pageSize, int pageIndex, string fldSort, bool sort, string strCondition, out int pageCount, out int count)
{
string strSql;
DataSet ds = SqlHelper.PageList(SqlHelper.LocalSqlServer, "[adminuser]", null, pageSize, pageIndex, fldSort, sort, strCondition, "Id", false, out pageCount, out count, out strSql);
return GetList(ds);
}
#endregion
/// <summary>
/// 由一行数据得到一个实体
/// </summary>
private Model.adminuser GetModel(DataRow r)
{
Model.adminuser model = new Model.adminuser();
model.Id = SqlHelper.GetInt(r["Id"]);
model.username = SqlHelper.GetString(r["username"]);
model.userpwd = SqlHelper.GetString(r["userpwd"]);
model.create_time = SqlHelper.GetDateTime(r["create_time"]);
return model;
}
//public Model.adminuser GetModel(Model.adminuser model, DataRow r)
//{
// Model.adminuser Model = new Model.adminuser();
// model.Id = SqlHelper.GetInt(r["Id"]);
// model.username = SqlHelper.GetString(r["username"]);
// model.userpwd = SqlHelper.GetString(r["userpwd"]);
// model.create_time = SqlHelper.GetDateTime(r["create_time"]);
// return model;
//}
/// <summary>
/// 由数据集得到泛型数据列表
/// </summary>
private IList<Model.adminuser> GetList(DataSet ds)
{
List<Model.adminuser> l = new List<Model.adminuser>();
foreach (DataRow r in ds.Tables[0].Rows)
{
l.Add(GetModel(r));
}
return l;
}
}
}
--------------------编程问答-------------------- 我的提问有问题?应该是这样问才对。。如何得到数据库中指定的adminuser表的指定ID的这条记录有没有这个用户名和密码。。。。 --------------------编程问答-------------------- 就是用ID确定有没有这条记录先在做判断 --------------------编程问答-------------------- select * from userTable where id = @id;
然后将这个*保存到一个对象中,如果没有这个用户,你可以设置user类,name,password = string.empty;
否则就是存在,然后再对比name,password是否对应。不对应就是有问题。
至于@id的声明。
SqlParameterparm paramter = new SqlParameter("@id", SqlDbType.Int, 4);
传递sqlcommand的时候,一同把这个paramter传入,否则你的sql中不存在parm变量声明,就会报错。 --------------------编程问答-------------------- 最好写一个基类,每个页面继承基类,这样在基类验证即可,避免反复的验证。用面向对象的思想编程,可以跟好的解决问题。 --------------------编程问答-------------------- select * from userTable where id = @id;
判断数据集是否大于0
或count(*)
sqldatareader获取信息 --------------------编程问答-------------------- 我觉得楼主的逻辑有问题,应该是先判断有没有这个用户名,可以将数据表中的所有行读取出来放到list集合中,然后遍历该集合,判断用户名是否存在,如果存在,那么判断其相应的密码是否正确,因为你遍历的是对象,所以无需再次遍历集合,这样就行了啊.只需要取一次数据,不用频繁取来取去的. --------------------编程问答-------------------- 谢谢各位的建意先试一下。。还是自己太菜鸟啦。。。如果是你们应该怎么写呢有了思路。。。
List <Model.adminuser> lis = new BLL.adminuser().GetList(null, null, null);
Model.adminuser mo = new Model.adminuser();
BLL.adminuser bl = new BLL.adminuser();
mo.username = TB_username.Text;
string PWD = StringOperation.StringOperation.Encrypt(TB_userpwd.Text, 1);
mo.userpwd = PWD;
下面就不知道怎么写啦。。。。自己才刚学对三层还不是很了解。。。
后面应该怎么办呢?还请写出谢谢要不然还是搞不定哦。。。。。谢谢各位高手
应该和zdj1987这位人兄说的思路才对。。。。不会写野还请写出来参考谢谢,,。。。
我上面的写法就很有问题。。。
List <Model.adminuser> lis = new BLL.adminuser().GetList(null, "Id='" + mo.Id + "'", null);
no.id 怎么能得值这里就出错啦
--------------------编程问答-------------------- --------------------编程问答-------------------- 为什么一定要分三层??????为什么一定要分这样的三层? --------------------编程问答-------------------- 学到东西了,友情帮顶 --------------------编程问答-------------------- 表现层我想就不用写了吧
我写下数据访问层 希望对你有用 我也是新人 一起成长
例如数据库中有个用户表:
admin_id,admin_name,password三列
models层定义一个类:Admin 定义三个属性
adminId,adminName,password
并封装好,写好构造函数,并定义初始值
DAL层
using System.Data.SqlClient;
using System.Data;
using DBHelper;//这是个我写的一个通用数据访问抽象类,不用在意
using ProTemp.Models;//Models层
IList<Admin> adminList;//声明一个集合
Admin admin;//声明一个对象
private const string admin_id = "@admin_id";
private const string admin_name = "@admin_name";
private const string password = "@password";
private const string GET_ADMIN_LIST = "select * from Admin";
//这是将参数提出来,以便后面实现参数抽象化
/// <summary>
/// 将参数抽象化,将所有参数抽象出来,将对象的属性值一一赋给参数
/// </summary>
/// <param name="admin"></param>
/// <returns></returns>
private SqlParameter[] SetParameters(Admin adminTemp)
{
return new SqlParameter[]{
new SqlParameter(admin_id,adminTemp.Admin_Id),
new SqlParameter(admin_name,adminTemp.Admin_Name),
new SqlParameter(password,adminTemp.Password),
};
}
///获取集合
public IList<Admin> GetAdminList() {
adminList = new List<Admin>();//使用List实现IList接口
SqlDataReader dr = SqlHelper.ExecuteReader(GET_ADMIN_LIST);
while (dr.Read())
{
admin = new Sys_Admin();
admin.Admin_Id = Convert.ToInt32(dr["admin_id"]);
admin.Admin_Name = Convert.ToString(dr["admin_name"]);
admin.Password = Convert.ToString(dr["password"]);
adminList.Add(Admin);
}
dr.Close();
return adminList;
}
剩下的在逻辑层进行判断就可以了,这里我没有使用到参数,不是不可以使用,只是我没有使用而已!- -
那为什么还要写个抽象参数的方法呢?
例如我们要添加一个管理员,我们就要使用参数,需要设定他的账号,密码等等...
下面写一个需要参数的方法
前面添加存储过程变量: private const string INSERT_ADMIN = "exec dbo.InsertIntoAdmin @admin_name,@password";
/// <summary>
/// 添加管理员
/// </summary>
/// <param name="admin">管理员对象</param>
/// <returns>sql语句执行之后的影响行数</returns>
public int AddAdmin(Admin admin)
{
int num = SqlHelper.ExecuteNonQuery(INSERT_ADMIN, CommandType.Text, SetParameters(admin));
return num;
}
即便你只需要1个参数,依然可以使用这个方法,因为我们已经在models层进行了对象初始化.
--------------------编程问答-------------------- 我写的Sys_Admin和Admin是一个 因为copy了以前写的 没改 呵呵 --------------------编程问答-------------------- 前面写的有点小瑕疵
表现层我想就不用写了吧
我写下数据访问层 希望对你有用 我也是新人 一起成长
例如数据库中有个用户表:
admin_id,admin_name,password三列
models层定义一个类:Admin 定义三个属性
adminId,adminName,password
并封装好,写好构造函数,并定义初始值
DAL层
using System.Data.SqlClient;
using System.Data;
using DBHelper;//这是个我写的一个通用数据访问抽象类,不用在意
using ProTemp.Models;//Models层
IList <Admin> adminList;//声明一个集合
Admin admin;//声明一个对象
private const string admin_id = "@admin_id";
private const string admin_name = "@admin_name";
private const string password = "@password";
private const string GET_ADMIN_LIST = "select * from Admin";
//这是将参数提出来,以便后面实现参数抽象化
/// <summary>
/// 将参数抽象化,将所有参数抽象出来,将对象的属性值一一赋给参数
/// </summary>
/// <param name="admin"> </param>
/// <returns> </returns>
private SqlParameter[] SetParameters(Admin adminTemp)
{
return new SqlParameter[]{
new SqlParameter(admin_id,adminTemp.Admin_Id),
new SqlParameter(admin_name,adminTemp.Admin_Name),
new SqlParameter(password,adminTemp.Password),
};
}
///获取集合
public IList <Admin> GetAdminList() {
adminList = new List <Admin>();//使用List实现IList接口
SqlDataReader dr = SqlHelper.ExecuteReader(GET_ADMIN_LIST);
while (dr.Read())
{
admin = new Admin();
admin.Admin_Id = Convert.ToInt32(dr["admin_id"]);
admin.Admin_Name = Convert.ToString(dr["admin_name"]);
admin.Password = Convert.ToString(dr["password"]);
adminList.Add(Admin);
}
dr.Close();
return adminList;
}
剩下的在逻辑层进行判断就可以了,这里我没有使用到参数,不是不可以使用,只是我没有使用而已!- -
那为什么还要写个抽象参数的方法呢?
例如我们要添加一个管理员,我们就要使用参数,需要设定他的账号,密码等等...
下面写一个需要参数的方法
前面添加存储过程常量: private const string INSERT_ADMIN = "exec dbo.InsertIntoAdmin @admin_name,@password";
/// <summary>
/// 添加管理员
/// </summary>
/// <param name="admin">管理员对象 </param>
/// <returns>sql语句执行之后的影响行数 </returns>
public int AddAdmin(Admin admin)
{
int num = SqlHelper.ExecuteNonQuery(INSERT_ADMIN, CommandType.Text, SetParameters(admin));
return num;
}
即便你只需要1个参数,依然可以使用这个方法,因为我们已经在models层进行了对象初始化.
补充:.NET技术 , C#