频 道 直 达 - 新闻 - 培训 - 软件 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 读书 - 博客 - BBS
51CTO.COM_中国最大的网络技术网站
找资料:

12.2.2 实现CarRentalReservation组件

作者: [美] Thiru Thangarathinam 著/郝刚、严治国、罗宇波. 出处:人民邮电出版社  2008-05-11 16:35    砖    好    评论   进入论坛
阅读提示:《ASP.NET 2.0数据库高级编程》第12章为您介绍的是实例研究:使用ASP.NET 2.0和SQL Server 2005构成的N层架构创建在线租订系统,本节主要讲的是实现CarRentalReservation组件。

12.2.2  实现CarRentalReservation组件

在本节中,读者将学习C#类库CarRentalReservation的实现。该组件包括所有必要的类和方法,它们为在线预订系统提供核心功能。首先,使用Visual Studio 2005创建一个新的名为CarRentalReservation的Visual C#类库项目。创建项目后,将默认类名称Class1修改为UserDetail。UserDetail类可作为与用户相关数据的保存容器,该类的实现如示例12-1所示。

示例12-1:UserDetail类代码

 using System;
namespace CarRentalReservation
{
[Serializable]
public class UserDetail
{
protected string userID;
protected string passWord;
protected string name;
protected string address;
protected string phone;
protected string city;
protected string state;
protected string zip;
    public string UserID
{
get { return userID; }
set { userID = value; }
}
public string PassWord
{
get { return passWord; }
set { passWord = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public string Address
{
get { return address; }
set { address = value; }
}
public string Phone
{
get { return phone; }
set { phone = value; }
}
public string City
{
get { return city; }
set { city = value; }
}
public string State
{
get { return state; }
set { state = value; }
}
public string Zip
{
get { return zip; }
set { zip = value; }
}
}
}

正如在示例12-1中看到的代码,UserDetail类公开了一些属性,这些属性可作为用户相关数据的容器。

1.实现数据访问层方法

目前,已经实现了保存用户相关数据的容器。这只是实现的一部分,接着需要创建一个数据访问层类,以便保存数据和从Users表中返回数据。这是由UserDB类来实现。UserDB类的实现如示例12-2所示。

示例12-2:实现UserDB类

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Text;
using System.Xml;
namespace CarRentalReservation
{
public class UserDB
{
public bool IsValidUserLogIn(string userName, string passWord)
{
try
{
using (SqlConnection connection = new SqlConnection())
{
string connectionString =
System.Web.Configuration.WebConfigurationManager.
ConnectionStrings["rentalCarReservation"].ConnectionString;
connection.ConnectionString = connectionString; connection.Open();
SqlCommand command = new SqlCommand("IsValidUserLogIn", connection);
command.CommandType = CommandType.StoredProcedure;
SqlParameter paramUserName = new SqlParameter("@UserID",
SqlDbType.VarChar, 20);
paramUserName.Value = userName;
command.Parameters.Add(paramUserName);
SqlParameter paramPassWord = new SqlParameter("@Password",
SqlDbType.VarChar, 10);
paramPassWord.Value = passWord;
command.Parameters.Add(paramPassWord);
SqlParameter paramRetValue = new SqlParameter
("@RetValue", SqlDbType.Int, 4);
paramRetValue.Direction = ParameterDirection.Output;
command.Parameters.Add(paramRetValue);
command.ExecuteNonQuery();
// 获取存储过程的返回值,接着将其赋值给一个变量
int retValue = (int)paramRetValue.Value;
if (retValue == -1)
{
throw new InvalidCredentialsException("Invalid Login");
}
else
{
return true;
}
}
}
catch (Exception ex)
{
throw ex;
}
}
    public bool AddUserInfo(UserDetail user)
{
try
{
using (SqlConnection connection = new SqlConnection())
{
string connectionString =
System.Web.Configuration.WebConfigurationManager.
ConnectionStrings["rentalCarReservation"].ConnectionString;
connection.ConnectionString = connectionString; connection.Open();
SqlCommand command = new SqlCommand("AddUser", connection);
command.CommandType = CommandType.StoredProcedure;
SqlParameter paramUserName = new SqlParameter("@UserID",
SqlDbType.VarChar, 20);
paramUserName.Value = user.UserID;
command.Parameters.Add(paramUserName);
SqlParameter paramPassWord = new SqlParameter("@Password",
SqlDbType.VarChar, 10);
paramPassWord.Value = user.PassWord;
command.Parameters.Add(paramPassWord);
SqlParameter paramName = new SqlParameter("@Name",SqlDbType.VarChar, 128);
paramName.Value = user.Name;
command.Parameters.Add(paramName);
SqlParameter paramAddress = new SqlParameter("@Address",
SqlDbType.VarChar, 128);
paramAddress.Value = user.Address;
command.Parameters.Add(paramAddress);
SqlParameter paramPhone = new SqlParameter("@Phone", SqlDbType.Xml);
paramPhone.Value = new SqlXml(new XmlTextReader(user.Phone,
XmlNodeType.Document, null));
command.Parameters.Add(paramPhone);
SqlParameter paramCity = new SqlParameter("@City", SqlDbType.VarChar, 50);
paramCity.Value = user.City;
command.Parameters.Add(paramCity);
SqlParameter paramState = new SqlParameter("@State", SqlDbType.Char, 2);
paramState.Value = user.State;
command.Parameters.Add(paramState);
SqlParameter paramZip = new SqlParameter("@Zip", SqlDbType.Char, 5);
paramZip.Value = user.Zip;
command.Parameters.Add(paramZip);
command.ExecuteNonQuery();
return true;
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}
UserDB类中包括两个方法:IsValidUserLogIn()和AddUserInfo()。IsValidUserLogIn()方法根据RentalCarReservation数据库来验证客户的用户名和密码。在内部,IsValidUserLogIn()方法调用存储过程IsValidUserLogIn。如果发现了包括特定用户名和密码的记录,存储过程IsValidUserLogIn返回1;否则,返回-1。根据存储过程返回的值,IsValidUserLogIn方法要么返回true,要么抛出InvalidCredentialsException类型的异常。InvalidCredentialsException的声明如下所示:
public class InvalidCredentialsException : Exception
{
public InvalidCredentialsException(string exceptionMessage):
base(exceptionMessage)
{ }
}

用户定义的异常能够在发生业务逻辑错误时,或者特定条件下通知客户。还能够实现自定义异常处理机制,例如将登录错误添加到事件日志中,发送电子邮件给管理员等。

AddUserInfo()方法将用户信息存储到User表中。该方法将UserDetail对象作为参数,解析该对象的内容,执行存储过程,根据执行结果返回true或者false。注意,将Phone列(该列是XML类型)添加到SqlCommand对象的Parameters集合中:

SqlParameter paramPhone = new SqlParameter("@Phone", SqlDbType.Xml);
paramPhone.Value = new SqlXml(new XmlTextReader(user.Phone, XmlNodeType.Document, null));
command.Parameters.Add(paramPhone);

通过将枚举SqlDbType.Xml传递给SqlParameter对象构造函数的第二个参数,能够将列类型设置为XML。然后,将System.Data.SqlTypes.SqlXml类型的对象赋值给SqlParameter对象的Value属性。既然已经查看了UserDB类,接着就可以关注RentalDB类了。该类主要用户搜索汽车和进行预订。

2.实现RentalDB类

RentalDB类的公开方法之一是SearchRentalCar(),该方法能够根据特定条件集合搜索汽车。示例12-3列举了RentalDB类的代码。

示例12-3:实现RentalDB类

using System;
using System.Data;
using System.Data.SqlClient;
namespace CarRentalReservation
{
public class RentalDB
{
public DataSet SearchRentalCar(string rentalPickupLocation, DateTime pickupDate,
int carClassID)
{
try
{
using (SqlConnection connection = new SqlConnection())
{
string connectionString = System.Web.Configuration.WebConfigurationManager.
ConnectionStrings["rentalCarReservation"].ConnectionString;
connection.ConnectionString = connectionString;
DataSet car = new DataSet("Cars");
SqlDataAdapter adapter = new SqlDataAdapter("SearchRentalCar", connection);
adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
SqlParameter paramRentalPickupLocation = new
SqlParameter("@rentalPickupLocation", SqlDbType.VarChar, 50);
paramRentalPickupLocation.Value = rentalPickupLocation;
adapter.SelectCommand.Parameters.Add(paramRentalPickupLocation);
SqlParameter paramPickupDate = new SqlParameter("@pickupDate",
SqlDbType.DateTime);
paramPickupDate.Value = pickupDate;
adapter.SelectCommand.Parameters.Add(paramPickupDate);
SqlParameter paramCarClassID = new SqlParameter("@carClassID",
SqlDbType.Int);
paramCarClassID.Value = carClassID;
adapter.SelectCommand.Parameters.Add(paramCarClassID);
adapter.Fill(car, "Car");
return car;
}
}
catch (Exception ex)
{
throw ex;
}
}
    public int AddBooking(int carID, string customerID, int carClassID,
string rentalPickupLocation, string rentalDropoffLocation, DateTime pickupDate,
DateTime dropoffDate)
{
try
{
using (SqlConnection connection = new SqlConnection())
{
string connectionString = System.Web.Configuration.WebConfigurationManager.
ConnectionStrings["rentalCarReservation"].ConnectionString;
connection.ConnectionString = connectionString; connection.Open();
SqlCommand command = new SqlCommand("AddBooking", connection);
command.CommandType = CommandType.StoredProcedure;
SqlParameter paramCarID = new SqlParameter("@carID", SqlDbType.Int);
paramCarID.Value = carID;
command.Parameters.Add(paramCarID);
SqlParameter paramCustomerID = new SqlParameter("@customerID",
SqlDbType.VarChar, 20);
paramCustomerID.Value = customerID;
command.Parameters.Add(paramCustomerID);
SqlParameter paramCarClassID = new SqlParameter("@carClassID",
SqlDbType.Int);
paramCarClassID.Value = carClassID;
command.Parameters.Add(paramCarClassID);
SqlParameter paramRentalPickupLocation = new
SqlParameter("@rentalPickupLocation", SqlDbType.VarChar, 50);
paramRentalPickupLocation.Value = rentalPickupLocation;
command.Parameters.Add(paramRentalPickupLocation);
SqlParameter paramRentalDropoffLocation = new
SqlParameter("@rentalDropOffLocation", SqlDbType.VarChar, 50);
paramRentalDropoffLocation.Value = rentalDropoffLocation;
command.Parameters.Add(paramRentalDropoffLocation);
SqlParameter paramPickupDate = new SqlParameter("@pickupDate",
SqlDbType.DateTime);
paramPickupDate.Value = pickupDate;
command.Parameters.Add(paramPickupDate);
SqlParameter paramDropoffDate = new SqlParameter("@dropoffDate",
SqlDbType.DateTime);
paramDropoffDate.Value = dropoffDate;
command.Parameters.Add(paramDropoffDate);
SqlParameter paramBookingID = new SqlParameter("@bookingID", SqlDbType.Int);
//设置paaBookingID参数为输出参数
paramBookingID.Direction = ParameterDirection.Output;
command.Parameters.Add(paramBookingID);
command.ExecuteNonQuery();
int bookingID = Convert.ToInt32(command.Parameters["@bookingID"].Value);
return bookingID;
}
}
catch (Exception ex)
{
throw ex;
}
}
    public DataTable GetCarClassCodes()
{
try
{
using (SqlConnection connection = new SqlConnection())
{
string connectionString = System.Web.Configuration.WebConfigurationManager.
ConnectionStrings["rentalCarReservation"].ConnectionString;
connection.ConnectionString = connectionString;
DataTable car = new DataTable("CarClassCodes");
SqlDataAdapter adapter = new SqlDataAdapter("GetCarClassCodes", connection);
adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
adapter.Fill(car);
return car;
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}

除了SearchRentalCar()方法,RentalDB类还包括两个方法:AddBooking(),该方法将预订信息存储到数据库中;GetCarClassCodes(),该方法返回Car_Class表中所有汽车类别代码。基于精简篇幅的考虑,书中不会详细讲解这些方法的实现。然而,读者可以从www.wrox.com下载该实例的完整代码。

3.实现StockDB类

正如名称暗示的那样,StockDB类提供了一些专门用于访问Stocks表的方法。该类实现了GetStockQuote()方法,该方法根据提供的代号返回股票价格。示例12-4列举了StockDB类的代码。

示例12-4:实现StockDB类

using System;
using System.Data;
using System.Data.SqlClient;
using System.Xml;
namespace CarRentalReservation
{
public class StockDB
{
public XmlDocument GetStockQuote(string name)
{
try
{
using (SqlConnection connection = new SqlConnection())
{
string connectionString = System.Web.Configuration.
WebConfigurationManager.
ConnectionStrings["rentalCarReservation"].ConnectionString;
connection.ConnectionString = connectionString; connection.Open();
SqlCommand command = connection.CreateCommand();
command.CommandText = "GetStockQuote";
command.CommandType = CommandType.StoredProcedure;
SqlParameter paramName = new SqlParameter("@Name", SqlDbType.Char, 4);
paramName.Value = name;
command.Parameters.Add(paramName);
XmlReader reader = command.ExecuteXmlReader();
XmlDocument doc = new XmlDocument();
//将XmlReader加载到XmlDocument object
doc.Load(reader);
return doc;
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}
GetStockQuote()方法通过执行存储过程GetStockQuote可返回股票价格。该存储过程接受公司代号为参数,同时以XmlReader对象形式返回XML输出。然后,将这个XmlReader对象加载到XmlDocument对象中,最后将该对象返回给调用者。


【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节
专题
Sun以10亿美元并购开源数据库厂商MySQL
系统应用日志分析管理
网络管理系统如何支撑ITSM
企业Web安全威胁在线评估系统
赛门铁克诺顿误杀Windows系统文件 导致百万系统崩溃
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 最 大 的 网 络 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
汶川大地震 IT技术人为同胞生命祈福
汶川大地震 IT技术人为同胞生..
访问控制列表(ACL)介绍
访问控制列表(ACL)介绍
视频访谈:网管员如何踏上高薪之路
视频访谈:网管员如何踏上高薪..
· 视频访谈:网管员如何踏..
· 首届中国IT工程师生态..
· 华为路由器配置
· 全面解析35岁技术人的..
· 企业数据恢复指南
· 龙芯要做中国的“奔腾”
· 2008年上半年全国软考..
· 交换机故障解决指南
· Vista SP1对决XP SP3
· LAMP技术精解
· 微软出价446亿美元收购..
· 网络故障排除宝典
· AIX操作系统管理应用(..
· 华为员工自杀频频拷问..
· 三层交换技术专题
· ARP攻击防范与解决方案
ARP攻击防范与解决方案
ARP攻击防范与解决方案
iSCSI应用与发展
iSCSI应用与发展
SQL Server 2008/2005全解
SQL Server 2008/2005全解
· SQL Server 2008/2005..
· SOA 面向服务架构
· SQL Server 2008/2005..
· iSCSI应用与发展
· RAID——磁盘阵列基础
· Apache技术专题
· 三层交换技术专题
· SQL Server入门到精通
· Apache技术专题
· 国际文档格式标准开战
· 路由器设置与口令恢复
· 打造安全服务器
· PHP开发应用手册
· SOA 面向服务架构
· 企业数据恢复指南
· ADSL应用面面俱到
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
iSCSI应用与发展
iSCSI应用与发展
· iSCSI应用与发展
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· Apache技术专题
· iSCSI应用与发展
· 三层交换技术专题
· Apache技术专题
· 企业数据恢复指南
· RAID——磁盘阵列基础
· 路由器设置与口令恢复
· SOA 面向服务架构
· ADSL应用面面俱到
· ADSL应用面面俱到
· 反垃圾邮件技术应用
· 访问控制列表(ACL)介绍