当前位置:编程学习 > C#/ASP.NET >>

三层登录验证出错急高手看看。。。。。是不是这样。。。

我要求的目地是:点登录先看用名和密码正不正确。。。并且存不存在这个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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,