求教,简单的三层的dal应该如何写?

eaqpi 2012-04-06 11:13:33
正在学习三层构架。

在DAL里面写了个更新语句如下:
Public Function Run_Sqlstr(ByVal SqlStr As String) As Int64
Dim cn As New SqlConnection(My.Settings.CnStr)
cn.Open()
Using txn As SqlTransaction = cn.BeginTransaction("开始事务")
Try
Dim cmd As New SqlCommand(SqlStr, cn)
cmd.Transaction = txn
Dim ChRow As Integer = cmd.ExecuteNonQuery()
txn.Commit()
Return ChRow
Catch ex As Exception
txn.Rollback()
Throw New Exception(ex.Message.ToString)
Finally
cn.Close()
End Try
End Using
End Function


然后只需要在BLL里面调用即可,插个个小问题 "开始事务" 这个字符串有意义吗?做什么用的?

为了防止sql的注入,我想改成 cmd.Parameters 的方式来添加sql的参数。我应该怎么做

如果在DAL中放入Parameters 就必须在这段代码里固化sql语句,

比如”INSERT INTO [TABLENAME] (ID,NAME) VALUES (@ID,@NAME)"

这是我所不希望看见的。

有什么办法可以在bll层理组装好Parameters,DAL只负责执行就可以了?

就像上面的程序类似,bll里面给出各种sqlstr,dal这段代码都能用,而不是每条sqlstr都需要在dal里面定义个function,专门来执行某个sqlstr。

有没有什么好的方法,给个简单的实例吧。最好是使用 SqlDataAdapter的。
...全文
291 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2012-04-26
  • 打赏
  • 举报
回复
.net 没有官方 或 成熟的三层的框架么?
蓝海 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
我的想法就是类似如下的代码
UI:

VB.NET code
Private Sub Button登陆_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button登陆.Click
If UserBLL.CheckUserExist(TXT用户名.Text, TXT密码.……
[/Quote]

先不说算不算三层!

你这里的 BLL 只是将 UI 传过来的参数,拼装成 SQL 串,发给 DAL 执行,如果你的 BLL 里的所有方法都是干这么一件事的,那么不说它算不算单独一个层,起码可以说这个 BLL 做的事情少了点;

本人目前也在做这个事,想这样实现 BLL 层,不过,还没做完,只做到部分,具体目标如下;

BLL 层主要做这样几件事(但不知道对不对,先做了再说吧):

1、BLL 将 UI 传过来的实体数据(类似 JAVABEAN,这里不知道叫什么了,呵呵)
根据需要,通过 ADO 进行增、删、改、查的操作;
2、BLL 支持方法级事务管理,即具指定特征的方法中不必书写启动事务,提交事务的代码,
该 BLL 自动调用 DAL 中的启动事务,提交、或回滚!
(事务管理可能有很多种,这个可能是其中一种)
3、该 BLL 有免写部分简单的 SQL 功能,举例:如简单的单表操作增、删、改、查;
UI 只需传对参数,后续的任何一层都不必写具体的 SQL,BLL 直接根据实体类型,识别其对应
数据库中表,进行相关操作;
4、锁管理器,数据并发锁的控制,表级锁、行级锁;
5、工作流管理;

(有什么说的不对的地方,还请大家赐教,共同探讨一下了)
eaqpi 2012-04-07
  • 打赏
  • 举报
回复
我的想法就是类似如下的代码
UI:
 Private Sub Button登陆_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button登陆.Click
If UserBLL.CheckUserExist(TXT用户名.Text, TXT密码.Text) Then
Me.Close()
End If
End Sub


BLL:

Public Function CheckUserExist(ByVal UserName As String, ByVal UserPassWord As String) As Boolean
If UserName.Trim.ToString = "" Or UserPassWord.Trim.ToString = "" Then
MsgBox("用户名及密码不能为空!")
Return False
Exit Function
End If
Dim TmpSqlStr As String = "SELECT count(*) FROM UserInfo where username ='" & UserName & "' and userpassword ='" & UserPassWord & "'"
If DAL.Run_Sqlstr(TmpSqlStr) = 1 Then
Return True
Else
MsgBox("用户名或密码错误!")
Return False
End If
End Function


DAL:
 Public Function Run_Sqlstr(ByVal SqlStr As String) As Int64
Dim cn As New SqlConnection(CnStr)
cn.Open()
Using txn As SqlTransaction = cn.BeginTransaction("开始事务")
Try
Dim cmd As New SqlCommand(SqlStr, cn)
cmd.Transaction = txn
Dim ChRow As Integer = cmd.ExecuteScalar
txn.Commit()
Return ChRow
Catch ex As Exception
txn.Rollback()
Throw New Exception(ex.Message.ToString)
Finally
cn.Close()
End Try
End Using
End Function


算不算三层我不知道。我就是想把程序改成使用 cmd.Parameters 用来防止sql注入。
yufei_yuxuan 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
这类“三层”没有意义。你的这个描述中的所谓的BLL,就是用来调用DAL的,因此是假BLL,因此没有意义。
[/Quote]
真的BLL是什么样子
yufei_yuxuan 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
这类“三层”没有意义。你的这个描述中的所谓的BLL,就是用来调用DAL的,因此是假BLL,因此没有意义。
[/Quote]
真的BLL是什么样子
bindofn 2012-04-07
  • 打赏
  • 举报
回复
BLL类我现在能做的也就刷选一下数据,还没有到达楼上所说的那么牛叉的地步,不过我想可以慢慢来嘛,慢慢写,它总会强大起来的
EnForGrass 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

难道是我的做法不正确?

我的想法很简单

UI:

将界面客户的输入组装成打包,做成像datarow,datatable,arrylist之类的数据,提交给 BLL

以登陆窗体为例,

我只要调用checkUser(textbox1.text,textbox2.text)

等待BLL返回,判断result.OK。true的话就完成,false的话啥都不干,等bll显……
[/Quote]
其实业务逻辑远比你描述的复杂,设计业务逻辑是和接口息息相关
eaqpi 2012-04-07
  • 打赏
  • 举报
回复
难道是我的做法不正确?

我的想法很简单

UI:

将界面客户的输入组装成打包,做成像datarow,datatable,arrylist之类的数据,提交给 BLL

以登陆窗体为例,

我只要调用checkUser(textbox1.text,textbox2.text)

等待BLL返回,判断result.OK。true的话就完成,false的话啥都不干,等bll显示错误代码。
BLL:

对传过来的数据 拼装 SQLstr,并完成一些业务的逻辑,比如:用户名不可重复,密码太简单之类的问题。

调用固定的DAL中的操作语句。把返回结果告诉 UI .

不需要 DAL知道数据库中User的数据库是否多了个部门,或者多了个时间戳。由BLL实现。

DAL:

就是操作数据库,对BLL送过来的代码执行,返回 返回值 给BLL。

任何一个工程,DAL的代码拷贝过去,基本不用改动,都能用。
lele1028265767 2012-04-07
  • 打赏
  • 举报
回复
唉,话说我的BLL就是你说那种假BLL,这个以后要改啊!!!唉,努力!!![Quote=引用 4 楼 的回复:]
在所谓BLL中,直接调用ADO.NET也是可以的,从任何一种SqlHelper中移植一两个方法也是可以的。你就可以多移植几个。我则是喜欢多写几条直接调用ado.net的代码,因为我觉得SqlHelper没有省什么时间(可能是因为我浪费的时间比较少)。
[/Quote]
  • 打赏
  • 举报
回复
在所谓BLL中,直接调用ADO.NET也是可以的,从任何一种SqlHelper中移植一两个方法也是可以的。你就可以多移植几个。我则是喜欢多写几条直接调用ado.net的代码,因为我觉得SqlHelper没有省什么时间(可能是因为我浪费的时间比较少)。
  • 打赏
  • 举报
回复
一个好的BLL,往往根据针对应用行业、通讯、界面交互设计等技术的深入研究,作出的前期设计接口。至于其内部实现以及如何调用DAL,则重构过许多版本。例如你想另外一个省的手机用户发彩信,甚至通过发短信来(从手机银行)交信息费,你只是发一个短信而已,至于此BLL接口之下涉及了多少个路由器、多少个数据库、多少远程服务,你根本不用管。这才是BLL设计。
  • 打赏
  • 举报
回复
这类“三层”没有意义。你的这个描述中的所谓的BLL,就是用来调用DAL的,因此是假BLL,因此没有意义。
EnForGrass 2012-04-06
  • 打赏
  • 举报
回复

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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