6/29 原型编码阶段:(1)连接并访问数据库

打开VS2005的CAROA项目,第一个程序我就想做员工列表页面。以便熟悉和了解asp.net2.0中对数据库的操作和显示方法。

我的目的很明确,就是实现员工管理功能第一阶段要求:
列出所有部门(下拉列表)
选择部门列出相应员工(GridView,级联)
选择员工显示员工详细信息(DetailsView)
增加新部门(部门存在上下级关系)
修改部门名称
删除部门(该部门下必须没有员工)
增加新员工
修改员工信息
删除员工

1.首先进行数据库设计和范例数据的填充:
表Clerk

字段名类型说明
ClerkIDint主键
RealNamenvarchar()员工姓名
JobNumnvarchar()员工工号
DeptIDint部门编号
数据有陈公客,王公客,张大客,李大客。分属相关的部门。

表CODE_Dept
字段名类型说明
DeptIDint主键
DeptNamenvarchar()部门名称
ParentDeptIDint上级部门
AreaIDint地区编号
数据有公客部,市场部,大客部三条。都属于南京分公司。

表CODE_Area
字段名类型说明
AreaIDint主键
AreaNamenvarchar()地区名称
数据有南京,北京二条。
在数据库关系图中,我们将Code_Area,Code_Dept,Clerk关联起来。

在表里面添加示例数据后,按照我们设定的目标开始进行编码!

2.怎样读取web.config中的数据库连接字串:
web.config中的数据库连接字串部分:

<configuration>
None.gif 
<appSettings/>
None.gif 
<connectionStrings>
None.gif  
<add name="CAROAConnectionString" connectionString="Data Source=192.xx.xx.xx;Initial Catalog=CAROA;Persist Security Info=True;User ID=xxx;Password=xxx" providerName="System.Data.SqlClient"/>
None.gif 
</connectionStrings>
.....

</configuration>


在DAL.cs数据访问层中读取如下(注DAL.cs是数据访问层的代码,主要用于完成最底层的数据库操作,来源于Microsoft Data Access Application Block for .NET):
None.gif public   static   readonly   string  CONN_STRING  =  System.Configuration.ConfigurationManager.ConnectionStrings[ " CAROAConnectionString " ].ConnectionString;

在表示层ClerkList.aspx的SqlDataSource中读取如下:
None.gif < asp:SqlDataSource ID = " SqlDataSource1 "  runat = " server "  ConnectionString = " <%$ ConnectionStrings:CAROAConnectionString %> "
None.gif            SelectCommand
= " SELECT * FROM [Clerk] " ></ asp:SqlDataSource >

使用Web.Configuration而非System.Configuration时代码如下:
None.gif using  System.Web.Configuration;
None.gifdot.gif
None.gifConnectingStringSettings conn_string 
=  WebConfigurationManager.ConnectionStrings[ " CAROAConnectionString " ];
None.gif
None.gif或者
None.gif
None.gif
string  conn_string  =  WebConfigurationManager.ConnectionStrings[ " CAROAConnectionString " ].ConnectionString;
None.gif

当然 如果要在项目中加密数据库连接字符串,可以这么做
None.gif D:\Program Files\Microsoft Visual Studio  8 \VC > aspnet_regiis  - pe  " connectionStrin
None.gif
gs "  -app  " / CarOAWeb "  -prov  " RSAProtectedConfigurationProvider "
或者这么写
aspnet_regiis -pe "connectinStrings" -app "/CarOAWeb"

解密只需 将-pe 改成 -pd即可
前提是 项目站点使用IIS,并且为网站配置了虚拟目录

否则会出现我这样的出错信息:
None.gif 正在加密配置节dot.gif
None.gif打不开虚拟路径“
/ CarOAWeb”和站点“默认网站”的配置。
None.gif指定的参数已超出有效值的范围。
None.gif参数名: site
None.gif失败
!

在ASP.NET 1.1中,我们一般是把连接字串写在<appSetting>之中,如下:
None.gif < configuration >
None.gif 
< appSettings />
None.gif  
< add key = " CAROAConnectionString "  value = " Data Source=192.xx.xx.xx;Initial Catalog=CAROA;Persist Security Info=True;User ID=xxx;Password=xxx "  providerName = " System.Data.SqlClient " />
None.gif 
</ appSettings >
None.gif
None.gifdot.gif..
None.gif
</ configuration >
None.gif

这时,读取设置的语句就是这样了(ASP.NET 2.0):
None.gif string  conn_string  =  System.Configuration.ConfigurationManager.AppSettings[ " CAROAConnectionString " ].ToString;

3.接下来打开数据库,执行选取所有员工sql语句
利用ADO.NET,我们是这样编写的:
首先在ClerkList.aspx中拖入一个GridView控件,ID是GridView1。
ClerkList.aspx.cs中代码如下:
None.gif using  System;
None.gif
using  System.Data;
None.gif
using  System.Data.SqlClient;
None.gif
using  System.Configuration;
None.gif
using  System.Collections;
None.gif
using  System.Web;
None.gif
using  System.Web.Security;
None.gif
using  System.Web.UI;
None.gif
using  System.Web.UI.WebControls;
None.gif
using  System.Web.UI.WebControls.WebParts;
None.gif
using  System.Web.UI.HtmlControls;
None.gif
None.gif
public  partial  class  clerklist : System.Web.UI.Page
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
protected void Page_Load(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
//创建连接字符串
InBlock.gif
        string conn_string = System.Configuration.ConfigurationManager.ConnectionStrings["CAROAConnectionString"].ConnectionString;
InBlock.gif        
//创建命令字符串
InBlock.gif
        string comm_string = "select * from clerk";
InBlock.gif        
//构造SqlDataAdapter对象
InBlock.gif
        SqlDataAdapter dataAdapter = new SqlDataAdapter(comm_string, conn_string);
InBlock.gif        
//创建一个DataSet对象
InBlock.gif
        DataSet dataSet = new DataSet();
InBlock.gif        
//填充DataSet对象
InBlock.gif
        dataAdapter.Fill(dataSet, "Clerk");
InBlock.gif        
//从DataSet中获取DataTable
InBlock.gif
        DataTable dataTable = dataSet.Tables["Clerk"];
InBlock.gif        
//将DataTable绑定到GridView
InBlock.gif
        GridView1.DataSource = dataTable;
InBlock.gif        GridView1.DataBind();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
DataSet虽然很强大,而且是离线数据源,但是需要额外的资源,为了创建更快速的记录集,我们可以用SqlDataReader对象实现相同的效果,但是DataReader相对于DataSet,只能向前。page_load部分的代码如下:
None.gif      protected   void  Page_Load( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
//创建连接字符串
InBlock.gif
        string conn_string = System.Configuration.ConfigurationManager.ConnectionStrings["CAROAConnectionString"].ConnectionString;
InBlock.gif        
//创建命令字符串
InBlock.gif
        string comm_string = "select * from clerk";
InBlock.gif        
//创建连接对象
InBlock.gif
        SqlConnection conn = new SqlConnection(conn_string);
InBlock.gif        
//创建命令对象
InBlock.gif
        SqlCommand cmd = new SqlCommand(comm_string);
InBlock.gif        
//打开连接
ExpandedSubBlockStart.gifContractedSubBlock.gif
        try dot.gif{
InBlock.gif            
//打开连接
InBlock.gif
            conn.Open();
InBlock.gif            
//为命令对象附加连接
InBlock.gif
            cmd.Connection = conn;
InBlock.gif            
//创建DataReader
InBlock.gif
            SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
InBlock.gif
InBlock.gif            GridView1.DataSource 
= dr;
InBlock.gif            GridView1.DataBind();
InBlock.gif
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
finally dot.gif{
InBlock.gif            conn.Close();
ExpandedSubBlockEnd.gif        }

两个代码执行的结果相同,都在ClerkList.aspx页面显示了员工列表。
ClerkIDRealNameJobNumDeptID
1陈公客10011
2王公客10021
3张大客30013
4李大客30023

如果不用ADO.NET,而使用SQLDataSource来完成这个功能,手工键入代码如下:

None.gif dot.gif
None.gif using System.Web.Configuration;
None.gif dot.gif
None.gif    protected void Page_Load(object sender, EventArgs e)
    {
        //取得数据库连接设置
        ConnectionStringSettings conn_string = WebConfigurationManager.ConnectionStrings["CAROAConnectionString"];
        //建立sql命令
        string sql_string = "select * from clerk";
        //建立SqlDataSource
        SqlDataSource sqldsClerkList = new SqlDataSource(conn_string.ConnectionString, sql_string);
        //通过SqlDataSource进行查询
        DataView dv = (DataView)sqldsClerkList.Select(DataSourceSelectArguments.Empty);
        //
        GridView1.DataSource = dv;
        GridView1.DataBind();
    }

根据圣殿祭司的话,以上代码是正宗ASP.NET2.0百分百之纯正语法,虽然我现在还不太明白dataview,dataset,datareader的区别以及适合在何时使用。

如果使用编写效率更高,手工代码更少的可视化方式编写,步骤如下(在实际编程中,我更多的采用这种方法,但是如果需要更灵活的数据操纵,也可以编写CodeBehind):
在ClerkList.aspx中拖入一个SqlDataSource控件,打开智能标签选择配置数据源,在对话框选择已有的连接CAROAConnectionString,接着设置查询语句或者直接从表中选择所需的字段。按下确定,即创建了数据源SqlDataSource1.
自动生成的代码如下:
None.gif          < asp:SqlDataSource ID = " SqlDataSource1 "  runat = " server "  ConnectionString = " <%$ ConnectionStrings:CAROAConnectionString %> "
None.gif            SelectCommand
= " SELECT * FROM [Clerk] " ></ asp:SqlDataSource >

再拖入一个GridView控件,设置数据源为SqlDataSource1,一旦设置了数据源,控件则会利用数据源返回的字段刷新自身的列。
自动生成的代码如下:
None.gif          < asp:GridView ID = " GridView1 "  runat = " server "  AutoGenerateColumns = " False "  DataKeyNames = " ClerkID "
None.gif            DataSourceID
= " SqlDataSource1 " >
None.gif            
< Columns >
None.gif                
< asp:BoundField DataField = " Clerk_ID "  HeaderText = " ClerkID "  InsertVisible = " False "
None.gif                    ReadOnly
= " True "  SortExpression = " ClerkID "   />
None.gif                
< asp:BoundField DataField = " RealName "  HeaderText = " RealName "  SortExpression = " RealName "   />
None.gif                
< asp:BoundField DataField = " JobNum "  HeaderText = " JobNum "  SortExpression = " JobNum "   />
None.gif                
< asp:BoundField DataField = " DeptID "  HeaderText = " DeptID "  SortExpression = " DeptID "   />
None.gif            
</ Columns >
None.gif        
</ asp:GridView >
如果数据库返回的列不需要做任何格式化,那么就不需要为每个列创建一个BoundField,代码可以进一步简化如下:
None.gif          < asp:GridView ID = " GridView1 "  runat = " server "  AutoGenerateColumns = " False "  DataKeyNames = " ClerkID "
None.gif            DataSourceID
= " SqlDataSource1 "  AutoGenerateColumns = " true " />

以上两个代码实现的效果完全一样。但是后者无法单独设置各个列标题,也无法选择所需的列。

实际上,在本项目中,访问数据库操作采用了分层的概念。app_code中DAL.cs负责底层的数据库操作,各个对象对应的类,比如Clerk.cs则提供了表示层所需的各种业务逻辑。最简单的情况是这样:
Clerk.cs
None.gif using  System;
None.gif
using  System.Collections.Generic;
None.gif
using  System.Text;
None.gif
using  System.Data;
None.gif
using  System.Data.SqlClient;
None.gif
None.gif
public   class  Clerk
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
//该方法返回所有职员列表的Dataset
InBlock.gif
        public DataSet GetAllClerkList()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
return DAL.ExecuteDataset(DAL.CONN_STRING, CommandType.Text,
InBlock.gif                
"select * from clerk"null);
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

None.gif

前台表示层ClerkList.aspx中拖入一个ObjectDataControl控件,数据源设为业务对象Clerk,数据方法select选择GetAllClerkList(),确定后,再拖一个GridView进来并将之数据源指定为ObjecyDataSource1即可。

采用上面这种方法虽然程序结构上分层了,但是GridView本身内置的Edit,Update方法都无法使用,必须写代码。

下面,我们对返回的员工列表结果做进一步扩展。

转载于:https://www.cnblogs.com/hulu/archive/2007/06/29/800575.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值