您的位置:首页 > 数据库

如何在.NET应用程序中使用数据库层

2010-06-01 10:39 399 查看
大多数应用软件的开发都是在一个多层或者多级的环境中完成的,除非你是在用过时的代码或系统在工作。这可能包括了与业务规则和表示层一起的数据库层。每一个n层环境的关键部分就是数据库层。在这篇专栏文章里,我们将分析怎样在.NET 的应用程序中使用数据库层。

代码分离

无论你是在构建一个网站、Windows操作系统、网站服务,还是其他任何一种应用程序,你肯定要将数据库的CRUD(创建、读取、更新和删除)操作合并。许多开发者经常从像网页这样的应用资源里直接调用数据库,但是这样就会导致噩梦般的维护或代码变换——尤其是当有必要改变数据库访问的时候。

当前的一种产业趋势是将数据访问代码同其余的代码相分离。用这种方式,你可以通过数据访问代码进行所需的数据库调用。这样就使得你能够在不涉及应用程序其余部分的情况下,进行数据库访问或者改变代码。除此之外,你还可以完全将数据访问代码移至它自己所属的类,在应用程序中重复使用它。

和其他为应用程序开发所做的努力一样,有不止一种的方法来处理它。你可以采取某种策略,使数据访问代码数据库变得独立,这样就会使得在不影响其他应用程序层的情况下,打开后端数据库变得很容易。另外,你的环境中还可以有一个标准化的后端数据库,因此就可能不需要那么高的透明级别了。

而且,你可以选择让数据访问代码通用化,以便让其适用于多个应用程序,或者为某个特定程序量身定制数据访问代码。和大多数话题一样,应用程序开发者会争论某种方法要比另一种方法好,但是到最后,它还是取决于你的环境、项目和时间限制。让我们来探讨一下在.NET 应用程序中数据访问层的运用。

构建数据访问层

基本上来说,数据访问层只是我们写入的与数据源相互作用的代码;它可以很简单,也可以很复杂,这根据你的需要来决定。举个例子,我们将创建一个数据访问类来处理与曾经风靡一时的SQL Server Northwind数据库之间的相互操作。我们的应用程序需要执行以下的数据库操作:

向用户表添加新的用户

从用户表删除用户

查看用户表中包括的用户信息

在Northwind数据库中运行存储过程。

我们从创建数据访问类开始。前面列表中的每个项目所对应的方法都包括在内。该类包含了以下方法来处理这些函数:

GetDataSet方法接受一个单独的,包含了要运行的存储程序名称的字符串参数。程序执行后,结果储存在一个DataSet对象中,该对象又通过此方法被返回。

GetCustomers方法是GetDataSet方法的一个变体,但是它是为了和Northwind的用户表相互作用专门定制的,然后在一个DataSet对象中返回所有的列。

AddCustomer方法接受需要的数据并向数据库添加记录。

DeleteCustomer方法把记录标识作为整数接受,它被用来从数据库中删除适当的记录。

RunProcedure方法接受一个字符串值,其中包括了在后端数据库运行的存储程序的名称。

GetDataReader方法接受一个字符串变量中的存储程序名称。这个程序在后端数据库中运行,其结果由该方法作为一个SqlDataReader对象被返回。

WriteToEventLog方法被所有方法用来记录Windows事件日志中的所有异常。

数据库连接字符串被储存在Web.config文件中(这在Web的应用程序被使用),但是app.config文件也可以被使用。类的ConnectionString属性从配置文件中检索得到值。而且,所有的方法都是静态的,所以它们可以不需要经过类的实例例示就可以使用。查看列表A

列表A

using System;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Data.SqlClient;
public class DataAccess {
static String connectionString;
public static String ConnectionString {
get {
if (connectionString == null) {
try {
connectionString = (String) ConfigurationSettings.AppSettings["connStr"];
} catch {
throw new Exception("Connection string not set in web.config.");
}
if (connectionString == null) {
throw new Exception("Connection string not set in web.config.");
} }
return connectionString;
} }
public static DataSet GetDataSet(string ProcName) {
DataSet tempDS = null;
SqlConnection conn = null;
SqlDataAdapter sda = null;
try {
tempDS = new DataSet();
conn = new SqlConnection(ConnectionString);
conn.Open();
sda = new SqlDataAdapter(ProcName, conn);
sda.Fill(tempDS);
return tempDS;
} catch (Exception ex) finally }
public static DataSet GetCustomers() {
DataSet tempDS = null;
SqlConnection conn = null;
SqlDataAdapter sda = null;
try {
tempDS = new DataSet();
conn = new SqlConnection(ConnectionString);
conn.Open();
sda = new SqlDataAdapter("sp_GetCustomers", conn);
sda.Fill(tempDS);
return tempDS;
} catch (Exception ex) finally }
public static void AddCustomer(     string pCompanyName, string pContactName, string pContactTitle, string pAddress, string pCity, string pState, string pPostalCode, string pCountry, string pPhone, string pFax) {
SqlConnection conn = null;
SqlCommand comm = null;
SqlParameter param1 = null;
SqlParameter param2 = null;
SqlParameter param3 = null;
SqlParameter param4 = null;
SqlParameter param5 = null;
SqlParameter param6 = null;
SqlParameter param7 = null;
SqlParameter param8 = null;
SqlParameter param9 = null;
SqlParameter param10 = null;
string procName = "sp_Add_Customer";
try  {
conn = new SqlConnection(ConnectionString);
conn.Open();
comm = new SqlCommand(procName, conn);
comm.CommandType = CommandType.StoredProcedure;
param1 = new SqlParameter("@CompanyName", SqlDbType.NVarChar, 40);
param1.Value = pCompanyName;
comm.Parameters.Add(param1);
param2 = new SqlParameter("@ContactName", SqlDbType.NVarChar, 30);
param2.Value = pContactName;
comm.Parameters.Add(param2);
param3 = new SqlParameter("@ContactTitle", SqlDbType.NVarChar, 30);
param3.Value = pContactTitle;
comm.Parameters.Add(param3);
param4 = new SqlParameter("@Address", SqlDbType.NVarChar, 60);
param4.Value = pAddress;
comm.Parameters.Add(param4);
param5 = new SqlParameter("@City", SqlDbType.NVarChar, 15);
param5.Value = pCity;
comm.Parameters.Add(param5);
param6 = new SqlParameter("@State", SqlDbType.NVarChar, 40);
param6.Value = pState;
comm.Parameters.Add(param6);
param7 = new SqlParameter("@PostalCode", SqlDbType.NVarChar, 10);
param7.Value = pPostalCode;
comm.Parameters.Add(param7);
param8 = new SqlParameter("@Country", SqlDbType.NVarChar, 15);
param8.Value = pCountry;
comm.Parameters.Add(param8);
param9 = new SqlParameter("@Phone", SqlDbType.NVarChar, 24);
param9.Value = pPhone;
comm.Parameters.Add(param9);
param10 = new SqlParameter("@Fax", SqlDbType.NVarChar, 24);
param10.Value = pFax;
comm.Parameters.Add(param10);
comm.ExecuteNonQuery();
} catch (Exception ex) finally }
public static void DeleteCustomer(string pCustomerID) {
SqlConnection conn = null;
SqlCommand comm = null;
SqlParameter param = null;
string procName = "sp_Delete_Customer";
try {
conn = new SqlConnection(ConnectionString);
conn.Open();
comm = new SqlCommand(procName, conn);
comm.CommandType = CommandType.StoredProcedure;
param = new SqlParameter("@CustomerID", SqlDbType.NVarChar, 5);
param.Value = pCustomerID;
comm.Parameters.Add(param);
comm.ExecuteNonQuery();
} catch (Exception ex) finally }
public static void RunProcedure(string pProcedureName) {
SqlConnection conn = null;
SqlCommand comm = null;
try {
conn = new SqlConnection(ConnectionString);
comm =new SqlCommand(pProcedureName, conn);
conn.Open();
comm.ExecuteNonQuery();
} catch(Exception ex) finally }
public static SqlDataReaderGetDataReader(string pProcedureName) {
SqlConnection conn = null;
SqlCommand comm = null;
SqlDataReadersdr = null;
try {
conn = new SqlConnection(ConnectionString);
comm = new SqlCommand(pProcedureName, conn);
conn.Open();
sdr = comm.ExecuteReader(CommandBehavior.CloseConnection);
} catch(Exception ex)
return sdr;
}
private static void WriteToEventLog(Exception objError) {
EventLogobjEventLog = new EventLog();
objEventLog.Source = "TechRepublic.com Application";
objEventLog.WriteEntry(objError.Message.ToString());
} }


当这个类准备就绪之后,你可以很容易地在应用程序中使用它。例如,一个DataGrid可以利用DataAccess和数据库交互作用。它可以利用由GetCustomers返回的DataSet对象。同样地,其他的方法也可以用来对后端数据进行操作。

a101
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐