标题:求教:“存储过程” 是写在数据访问层中的 SqlHelper 类中吗?
只看楼主
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
结帖率:91.67%
已结贴  问题点数:20 回复次数:11 
求教:“存储过程” 是写在数据访问层中的 SqlHelper 类中吗?
求教老师:

三层架构里,数据访问层是放那些访问数据库的方法的,比如增删改查。
“存储过程”是增删改查的自定义函数,对吗?

所以如果数据访问层定义的类是SqlHelper,那么就可将 自定义的“存储过程”函数放到SqlHelper中,这样理解对吗?

拜谢老师先!!!
搜索更多相关主题的帖子: 数据库 
2012-12-25 21:50
跳过去
Rank: 8Rank: 8
等 级:贵宾
威 望:20
帖 子:282
专家分:976
注 册:2012-8-13
得分:1 
写存储过程你就当做写SQL语句一样就可以了,在数据库中执行一下,然后在项目中 使用 存储过程的名字就行了

光棍中.....
2012-12-25 23:22
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
以下是引用跳过去在2012-12-25 23:22:35的发言:

写存储过程你就当做写SQL语句一样就可以了,在数据库中执行一下,然后在项目中 使用 存储过程的名字就行了
感谢 跳过去 老师指导!!!

“然后在项目中 使用 存储过程的名字就行了”---- 您是指在 “数据访问层”的“项目中”使用吗??

“三层架构搭建”是创建“项目”的,您指的项目是“数据访问层”的“项目”吗?

再次感谢 跳过去 指教!!!
2012-12-26 00:12
mpi
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:99
专家分:872
注 册:2012-11-14
得分:3 
以下是引用learnerok在2012-12-25 21:50:15的发言:

求教老师:

三层架构里,数据访问层是放那些访问数据库的方法的,比如增删改查。
“存储过程”是增删改查的自定义函数,对吗?

所以如果数据访问层定义的类是SqlHelper,那么就可将 自定义的“存储过程”函数放到SqlHelper中,这样理解对吗?

拜谢老师先!!!
存储过程是放在数据库中的,在数据库中定义存储过程,(用程序生成存储过程比较复杂,这里不介绍了,扯远了)数据访问层只需要定义连接方法,和各种操作的方法。
具体调用存储过程的地方是你的业务层,把存储过程名当作参数,根据你的业务需求,具体实现。
程序代码:
CREATE PROCEDURE [OWNER].[PROCEDURE NAME]
(
    @参数  --没参数的话把括号里的省略
)
AS
    SQL语句
GO



厌烦自私贪婪和不劳而获的人。
厌烦代码各种求,而不思进取的人。
本人也是菜鸟,求上进,踏实不浮躁的朋友共同进步。
2012-12-26 09:17
z909562139
Rank: 2
等 级:论坛游民
帖 子:32
专家分:87
注 册:2012-11-5
得分:8 
三层:界面层、数据访问层、业务逻辑层
在数据库中写相应的存储过程
create proc 存储过程名称

    @参数(参数根据需要写相应的,一般情况“查询”是没有参数的)
    as
    相应的增删改查的sql语句

Go
然后再数据库里执行一下
数据访问层:
using (SqlConnection conn = new SqlConnection("连接数据库字符串")
           {
               using (SqlCommand cmd = new SqlCommand())
               {
                   = " 存储过程名称";
                   = CommandType.StoredProcedure;
                    ......
                }
        }
2012-12-26 12:07
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
感谢 mpi 老师在4楼的指导!!!

再请教:

“数据访问层”就是实现对数据库的“增删改查”,对吗?

1. 既然“存储过程”就是封装好的“增删改查”的自定义函数,并且可以直接在“业务逻辑层”调用,
那么“数据访问层”还有用吗?

2. 您在4楼说的“数据访问层只需要定义连接方法,和各种操作的方法。” ---- 其中“各种操作的方法”指的是“增删改查”的方法吗?如果是,这些“增删改查”的方法 与 “存储过程”封装好的“增删改查”的自定义函数 又有什么区别???

多谢您的指导,再次感谢您!!!
2012-12-26 12:18
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
以下是引用z909562139在2012-12-26 12:07:28的发言:

三层:界面层、数据访问层、业务逻辑层
在数据库中写相应的存储过程
create proc 存储过程名称

    @参数(参数根据需要写相应的,一般情况“查询”是没有参数的)
    as
    相应的增删改查的sql语句

Go
然后再数据库里执行一下
数据访问层:
using (SqlConnection conn = new SqlConnection("连接数据库字符串")
           {
               using (SqlCommand cmd = new SqlCommand())
               {
                   = " 存储过程名称";
                   = CommandType.StoredProcedure;
                    ......
                }
        }
感谢 z909562139 老师指导!!!

您的指导让俺豁然开朗,明白了。

您的“说法” 似乎 与 4楼老师的“说法” 不一样,对吗??
2012-12-26 12:42
mpi
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:99
专家分:872
注 册:2012-11-14
得分:3 
以下是引用learnerok在2012-12-26 12:18:19的发言:

 感谢 mpi 老师在4楼的指导!!!

再请教:

“数据访问层”就是实现对数据库的“增删改查”,对吗?

1. 既然“存储过程”就是封装好的“增删改查”的自定义函数,并且可以直接在“业务逻辑层”调用,
那么“数据访问层”还有用吗?

2. 您在4楼说的“数据访问层只需要定义连接方法,和各种操作的方法。” ---- 其中“各种操作的方法”指的是“增删改查”的方法吗?如果是,这些“增删改查”的方法 与 “存储过程”封装好的“增删改查”的自定义函数 又有什么区别???

多谢您的指导,再次感谢您!!!
回复1,每个人的写法不一样,我的写法数据访问层的DBHelper类中封装static静态的增删改查的方法。
程序代码:
        public static DataTable RunProcDataTable(string storedProcName, SqlParameter[] parameters, string tableName)
        {
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = BuildQueryCommand(storedProcName, parameters);
            da.Fill(ds, tableName);
            return ds.Tables[tableName];
        }
简单的调用是
程序代码:
        public DataTable RunProcDataTable(string storedProcName, SqlParameter[] parameters, string tableName)
        {
            return DBHelper.RunProcDataTable(storedProcName, parameters, tableName);
        }

而在业务逻辑层,加上调用存储过程时,并不一定特指简单的增删改查,是跟业务逻辑相关的,可能带有参数,返回的结果也有可能是实体对象等等
程序代码:
        //获取短消息实体对象的业务处理方法
        public MsgSwapTB GetMsgInfo(string proc, SqlParameter[] para, string tableName)
        {
            DataTable dt = new DataTable();
            MsgSwapTB msg = new MsgSwapTB();
            dt = service.RunProcDataTable(proc, para, tableName);   //这里调用了数据访问层的带参数方法
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                msg.Mid = int.Parse(dt.Rows[i]["Mid"].ToString());
                msg.PostMsgUserID = dt.Rows[i]["PostMsgUserID"].ToString();
                msg.GetMsgUserID = dt.Rows[i]["GetMsgUserID"].ToString();
                msg.PostMsgName = dt.Rows[i]["PostMsgName"].ToString();
                msg.GetMsgName = dt.Rows[i]["GetMsgName"].ToString();
                msg.FilePath = dt.Rows[i]["FilePath"].ToString();
                msg.MsgTitle = dt.Rows[i]["MsgTitle"].ToString();
                msg.MsgContent = dt.Rows[i]["MsgContent"].ToString();
                msg.PostTime = dt.Rows[i]["PostTime"].ToString();
                msg.MsgState = dt.Rows[i]["MsgState"].ToString();
            }
            return msg;      //这里通过业务处理,返回了实体对象

厌烦自私贪婪和不劳而获的人。
厌烦代码各种求,而不思进取的人。
本人也是菜鸟,求上进,踏实不浮躁的朋友共同进步。
2012-12-26 13:39
mpi
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:99
专家分:872
注 册:2012-11-14
得分:3 
回复2.你看过上面的示例应该能看明白了,针对用户的UI界面层,只需要定义一个变量 MsgSwapTB Msg=GetMsgInfo("存储过程名",参数列表变量,"返回表名");就可以获取到UI上需要展示的数据,Lable1.Text=Msg.MsgTitle;
归纳一下,UI界面通过用户操作传递指令参数,执行相对应的业务逻辑方法,业务逻辑层向数据访问层的传递指令参数,通过数据访问层跟数据库做交互,存储过程中的增删改查才是真正操作数据库的SQL命令。前面都只是调用和传递而已。

厌烦自私贪婪和不劳而获的人。
厌烦代码各种求,而不思进取的人。
本人也是菜鸟,求上进,踏实不浮躁的朋友共同进步。
2012-12-26 13:48
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
感谢 mpi 老师的耐心指导!!!!

我刚刚开始学习数据库,阅读代码还是有一定难度(意思是,理解代码属于哪一层,起到的作用是什么等)。

所以这里想就“存储过程” 是 放在哪一层,如何调用 问题了解一下。

我能这样理解您的意思吗:

1. “数据访问层”中定义静态的“增删改查”,而这里的静态的“增删改查”就是调用的“存储过程”。在“业务逻辑层”中,再调用“数据访问层”中定义静态的“增删改查”(即封装在“存储过程”中的“增删改查”)?

2. 第5楼 的写法 与 您的写法 实现思想上是一致的,还是不同的?

再次感谢您的指教!!!



[ 本帖最后由 learnerok 于 2012-12-26 14:38 编辑 ]
2012-12-26 14:36



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-393471-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.056384 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved