三层架构的问题

ziye1987113 2009-03-21 02:42:37
我下了个简单的三层架构研究,稍微改了下,发现总是不对,有谁能帮我看看嘛?刚开始学这个,总是糊里糊涂的,哪位好心人能帮我解释下啊 ~~
BLL
User.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

/// <summary>
///User
/// </summary>
public class User
{
public User()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
public bool Read(user User)
{
string sql = "select * from user where yh= '" + User.Yh + "'and paw = '" + User.Paw+ "'";
DataBase Pn163 = new DataBase();
if (Pn163.ExecuteRead(sql) > 0)
{
return true;
}
else return false;
}

public DataTable EditTable(Model User)
{
string sql = "select * from Book where id=" + User.id;
DataBase Pn163 = new DataBase();
return Pn163.getDataTable(sql);
}


}


DAL DataBase.cs

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

/// <summary>
///数据操作类
/// </summary>
public class DataBase
{
private SqlConnection Conn = null;
private SqlCommand Cmd;
private SqlDataAdapter Da;
private DataSet Ds;
private DataTable Dt;
private String strConn;

public DataBase()
{
//
//在这里构造函数!
//
strConn = ConfigurationManager.AppSettings["ConnStr"];
}


/// <summary>
/// 打开Conn连接
/// </summary>
public void Open()
{
if (Conn == null)
{
Conn = new SqlConnection(strConn);
}
if (Conn.State.Equals(ConnectionState.Closed))
{
Conn.Open();
}
}


/// <summary>
/// 关闭Conn连接并释放....
/// </summary>
public void Close()
{
if (Conn.State.Equals(ConnectionState.Open))
{
Conn.Close();
//释放占用的资源
Conn.Dispose();
}
else
Conn.Dispose();
}


/// <summary>
/// 执行CMD操作类
/// </summary>
/// <param name="sql">sql语句</param>
/// <returns>Cmd</returns>
public int ExecuteCmd(string sql)
{
try
{
Open();
Cmd = new SqlCommand(sql, Conn);
return Cmd.ExecuteNonQuery();
}
catch
{
return -1;
}
finally
{
Close();
}
}

/// <summary>
/// DataSet类
/// </summary>
/// <param name="sql">sql语句</param>
/// <returns>返回DataSet</returns>
public DataSet GetDataSet(string sql)
{
try
{
Open();
Da = new SqlDataAdapter(sql, Conn);
Ds = new DataSet();
Da.Fill(Ds);
}
catch (Exception e)
{
throw new Exception(e.Message, e);
}
finally
{
Close();
}
return Ds;
}

/// <summary>
/// 验证类
/// </summary>
/// <param name="sql">sql语句</param>
/// <returns>返回Cmd</returns>
public int ExecuteRead(string sql)
{
try
{
Open();
Cmd = new SqlCommand(sql, Conn);
return (int)Cmd.ExecuteScalar();
}
catch
{
return -1;
}
finally
{
Close();
}
}


public DataTable getDataTable(string sql)
{
try
{
Open();
Da = new SqlDataAdapter(sql, Conn);
Dt = new DataTable();
Da.Fill(Dt);
}
catch (Exception e)
{
throw new Exception(e.Message, e);
}
finally
{
Close();
}
return Dt;
}
}


Model user.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

/// <summary>
///user 数据实体类
/// </summary>
public class user
{
public user() { }

private string _yh;
private string _paw;


public string Yh
{
get { return _yh; }
set { _yh = value; }
}

public string Paw
{
get { return _paw; }
set { _paw = value; }
}
}



主页面

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

//登陆验证事件
protected void Sub_Click(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
user User = new user();

User.Yh = TextBox1.Text;

User.Paw = TextBox2.Text;

User Pn163 = new User();

if (Pn163.Read(User))
{
Session["yh"] = User.Yh;

Response.Write("<script>alert('登陆成功!');location.href='Default.aspx'</script>");
}
else Response.Write("<script>alert('用户名或密码错误!');history.go(-1);</script>");

}
}


我无论输入什么,都显示“用户名或密码错误”,用断点调了下,发现好像是数据库没进去,但User.Yh User.Paw都有值的,不知道该怎么弄了~~有点长,有谁能帮我看看吗?
...全文
319 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
A971319231 2012-08-30
  • 打赏
  • 举报
回复
楼主可以发你修改后的代码过来瞄瞄吗?QQ971319231
飞飞虫2015 2009-03-22
  • 打赏
  • 举报
回复
up
ziye1987113 2009-03-22
  • 打赏
  • 举报
回复
搞定了~~收获颇多哈~~谢谢·~
坤哥zzz 2009-03-21
  • 打赏
  • 举报
回复
ExecuteScalar:已重写。 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。

看看是不是这个的问题~ ExecuteScalar应该返回的是string类型
humphrey923 2009-03-21
  • 打赏
  • 举报
回复
用 + + 这样的连接 不会造成注入攻击么???
我一般都是用参数 再try catch。

LZ,你的BLL层就是逻辑判断 不要添加SQL语句的吧?! 只应该判断界面层所产生的是那种操作 然后传给DB层进行操作再得到返回值
DB层,就是所有数据库的操作都在这一层。作用是连接数据库 一些基本操作 事务 然后下属一个SQLDAL 或者ACCESSDAL里面放其他操作的数据库增删改查语句

PS你还可以加个抽象工厂。
llsen 2009-03-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pgameli 的回复:]
BLL层
Read方法改一下

C# code
public bool Read(user User)
{
string sql = "select * from user where yh= '" + User.Yh + "'and paw = '" + User.Paw+ "'"; DataBase Pn163 = new DataBase();
if (Pn163.getDataTable(sql).Rows.Count>0)//换成DAL中getDataTable()方法
{
return true;
}
else return false;
}
[/Quote]

还有就是语句的
string sql = "select * from user where yh= '" + User.Yh + "' and paw = '" + User.Paw+ "'";


给楼主个建议:你各个层类名的定义可以区分下
比如实体层
MUser
逻辑层
BUser
这样不至于混淆

还有就是这些代码可以自动生成,,,
  • 打赏
  • 举报
回复
你的设计有问题,
三层里表示层是窗体部分,逻辑层就是BLL层,而数据访问层DAL才涉及到数据库操作类的层,你的有点混


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using BILL.Model;
using System.Configuration;

namespace BILL.DAL
{
public class DBHelper
{
private SqlConnection conn;
private SqlCommand cmd;
private SqlDataAdapter da;
private DataSet ds;

private string myServer;
private string myDatabase;
private string myUid;
private string myPwd;
private string myStrConn;


public DBHelper(string server, string database, string uid, string pwd)
{
//获取连接数据库语句的各个属性的值
this.MyServer = server;
this.MyDatabase = database;
this.MyUid = uid;
this.MyPwd = pwd;
try
{
conn = new SqlConnection(getStrConn());
//connOpen();

}
catch (Exception ex)
{
Console.Write(ex);
}

}
public DBHelper()
{
if (getStrConn() == null)
{
conn = new SqlConnection(getStrConn());
}
}
#region 封装连接数据库语句的属性

public string MyServer
{
//服务器地址
get { return myServer; }
set { myServer = value; }
}

public string MyDatabase
{
//数据库
get { return myDatabase; }
set { myDatabase = value; }
}

public string MyUid
{
//用户名
get { return myUid; }
set { myUid = value; }
}

public string MyPwd
{
// 密码
get { return myPwd; }
set { myPwd = value; }
}
#endregion

#region 组合数据库连接语句
public string getStrConn()
{
//组合连接数据库语句
try
{
//myStrConn = "server=" + myServer + ";database=" + myDatabase + ";uid=" + myUid + ";pwd=" + myPwd;
myStrConn = "server=.;database=hkrbill;uid=sa;pwd=sa;max pool size=5000;";
}
catch
{
}
return myStrConn;
}
#endregion

#region 打开数据库

private bool connOpen()
{
try
{
if (conn == null)
{
conn = new SqlConnection(getStrConn());
conn.Open();
}
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
}
catch(Exception exxx)
{
return false;
}

return true;

}
#endregion

#region 关闭数据库

private bool connClose()
{
try
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
catch
{
return false;
}

return true;
}
#endregion

#region 读取数据

public DataTable getDs(string strSelect)
{
// 读取数据库数据
try
{
connOpen();
da = new SqlDataAdapter(strSelect, conn);
ds = new DataSet();
da.Fill(ds);
connClose();
return ds.Tables[0];
}
catch
{
return null;
}
}
#endregion

#region 写入数据

public bool setDb(string sql,SqlParameter[] sp)
{
// 向数据库写入数据
try
{
if (connOpen())
{


cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddRange(sp);
cmd.ExecuteNonQuery();
connClose();
}
}
catch(Exception exx)
{
return false;
}

return true;

}
#endregion
}
}

smartxue1987 2009-03-21
  • 打赏
  • 举报
回复
连不上该种写法看看: 把<add key="conStr" value="server=.;database=text;uid=sa;pwd=ziye"/>该为


<add name="conStr" connectionString="Data Source=.;database=text;uid=sa;pwd=ziye“ providerName="System.Data.SqlClient" />

把 strConn = ConfigurationManager.AppSettings["ConnStr"];该为

strConn = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
看看,能不能连上
wuyq11 2009-03-21
  • 打赏
  • 举报
回复
代码三层不是很完善,可参考petshop。
调试SQL语句看看。到51aspx里看看很多,如dot bbs很基础
smellbear 2009-03-21
  • 打赏
  • 举报
回复
ding
ziye1987113 2009-03-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zhangbo6791644 的回复:]
user User = new user();

User.Yh = TextBox1.Text;

User.Paw = TextBox2.Text;

User Pn163 = new User();

if (Pn163.Read(User))
你的代码这里有两个"User",和一个Pn163,在判断条件那里,Pn163.Read(User),很明显是空值,肯定是“登录错误了”
[/Quote]

这个·~不是很明白啊~~能说具体点吗?
蜗牛水里爬 2009-03-21
  • 打赏
  • 举报
回复
你用数据库资源管理器 先连接下你的数据源 那里面有个选项我忘了具体叫什么 你可以看那里面的数据库连接字符串 直接复制到你的WEB.CONFIGE里去以后在别犯这个错误了
zhangbo6791644 2009-03-21
  • 打赏
  • 举报
回复
user User = new user();

User.Yh = TextBox1.Text;

User.Paw = TextBox2.Text;

User Pn163 = new User();

if (Pn163.Read(User))
你的代码这里有两个"User",和一个Pn163,在判断条件那里,Pn163.Read(User),很明显是空值,肯定是“登录错误了”
jhdxhj 2009-03-21
  • 打赏
  • 举报
回复
ding
ziye1987113 2009-03-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 maco_wang 的回复:]
Conn.Open();
能打开数据库吗?

应该是你数据库没有连接上
数据库连接字符串可以有问题
你把webconfig里的字符串发上来看看。
[/Quote]

好像不能打开,运行的时候直接跳过了~~

<?xml version="1.0"?>
<!--
注意: 除了手动编辑此文件以外,您还可以使用
Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
“网站”->“Asp.Net 配置”选项。
设置和注释的完整列表在
machine.config.comments 中,该文件通常位于
\Windows\Microsoft.Net\Framework\v2.x\Config 中
-->
<configuration>
<appSettings>
<add key="conStr" value="server=.;database=text;uid=sa;pwd=ziye"/>
</appSettings>
<connectionStrings>

</connectionStrings>
<system.web>
<!--
设置 compilation debug="true" 将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true。
-->
<compilation debug="true"/>
<!--
通过 <authentication> 节可以配置 ASP.NET 使用的
安全身份验证模式,
以标识传入的用户。
-->
<authentication mode="Windows"/>
<!--
如果在执行请求的过程中出现未处理的错误,
则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
开发人员通过该节可以配置
要显示的 html 错误页
以代替错误堆栈跟踪。

<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
</system.web>
</configuration>



这个是web.config的
叶子 2009-03-21
  • 打赏
  • 举报
回复
你调试一下,看看catch 不到东西吗
叶子 2009-03-21
  • 打赏
  • 举报
回复
Conn.Open();
能打开数据库吗?

应该是你数据库没有连接上
数据库连接字符串可以有问题
你把webconfig里的字符串发上来看看。
HsWong 2009-03-21
  • 打赏
  • 举报
回复
怎么SQL语句跑到业务层去了
ziye1987113 2009-03-21
  • 打赏
  • 举报
回复
怎么换更好的啊?我刚接触三层,还什么都不知道~~~自己摸索中啊~~大哥~~能给个例子不?
ziye1987113 2009-03-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gzy11 的回复:]
应该是数据库连接的问题ExecuteRead 返回的值是-1吧!
[/Quote]

是的~那应该怎么改啊?
加载更多回复(8)

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧