如何在.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
当这个类准备就绪之后,你可以很容易地在应用程序中使用它。例如,一个DataGrid可以利用DataAccess和数据库交互作用。它可以利用由GetCustomers返回的DataSet对象。同样地,其他的方法也可以用来对后端数据进行操作。
a101
代码分离
无论你是在构建一个网站、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
相关文章推荐
- 如何美化你的.net 应用程序 (皮肤使用)
- 使用 Python 和 Oracle 数据库实现高并发性 了解如何借助线程和并发性提升支持 Oracle 数据库的 Python 应用程序的吞吐量和响应性。
- 使用.NET开发数据库应用程序(2)---给初学者看的文章
- 使用.NET开发数据库应用程序(1)---给初学者看的文章
- 如何在VC中使用ADO开发数据库应用程序
- 如何使用C# WEBSERVICE 创建一个三层的数据库应用程序 http://www.xxju.net/article/200412/29_0004326567.htm
- 在 Oracle 数据库上使用 Visual Studio 2005 或 2008 构建 .NET 应用程序
- 使用.NET开发数据库应用程序(2)---给初学者看的文章
- 如何美化你的.net 应用程序 (皮肤使用)
- 使用.NET开发数据库应用程序(1)---给初学者看的文章
- 使用.NET开发数据库应用程序(2)---给初学者看的文章
- 在 .NET 中使用 BDP 和 DB2 UDB 构建分布式数据库应用程序3
- 使用.NET开发数据库应用程序(2)---给初学者看的文章
- 使用.NET开发数据库应用程序(1)---给初学者看的文章
- 如何使用C#创建一个三层的数据库应用程序
- 如何在x64的机器上使用WinDBG来debug一个32bit的.NET应用程序
- 使用.NET开发数据库应用程序(1)---给初学者看的文章
- 在 Oracle 数据库上使用 Visual Studio 2005 或 2008 构建 .NET 应用程序(官方文章转载)
- 在 Oracle 数据库上使用 Visual Studio 2005 或 2008 构建 .NET 应用程序
- 如何美化你的.net 应用程序 (皮肤使用)