在软件开发中,数据访问层(Data Access Layer,简称DAL)是应用程序与数据库之间的桥梁。它负责执行数据库操作,如查询、插入、更新和删除数据。本文将探讨如何设计和实现一个高效、灵活且易于维护的数据访问层。
数据访问层的构造函数是初始化数据库连接的关键。可以通过构造函数来接收连接字符串、已存在的数据库连接对象,或者不传递任何参数来创建一个新的连接。以下是构造函数的实现:
public class Database
{
private SqlConnection connection;
private SqlCommand dbCommand;
public Database(string Connection)
{
connection = new SqlConnection(Connection);
InitialiseCommand();
}
public Database(SqlConnection Connection)
{
connection = Connection;
InitialiseCommand();
}
public Database()
{
connection = new SqlConnection();
InitialiseCommand();
}
private void InitialiseCommand()
{
try
{
if (dbCommand == null)
{
dbCommand = new SqlCommand();
dbCommand.CommandType = CommandType.StoredProcedure;
if (connection != null)
{
dbCommand.Connection = connection;
}
}
}
catch (System.Exception ex)
{
throw ex;
}
}
}
上述代码展示了数据访问层的构造函数。它支持三种初始化方式:通过连接字符串、通过已存在的连接对象或者不传递任何参数。每种方式都会调用InitialiseCommand
方法来初始化命令对象。
执行存储过程是数据访问层的常见操作之一。需要定义两个方法:一个用于执行不返回数据的存储过程,另一个用于执行返回数据的存储过程。以下是这两个方法的实现:
public void Execute()
{
try
{
if (dbCommand.Connection.State != ConnectionState.Open) dbCommand.Connection.Open();
dbCommand.ExecuteNonQuery();
}
catch (System.Exception ex)
{
throw ex;
}
}
public DataTable Execute(string TableName)
{
SqlDataAdapter da;
DataSet ds;
DataTable dt = new DataTable();
try
{
da = new SqlDataAdapter(dbCommand);
ds = new DataSet();
da.Fill(ds, TableName);
if (ds.Tables.Count > 0)
dt = ds.Tables[0];
}
catch (System.Exception ex)
{
throw ex;
}
return dt;
}
第一个方法Execute
用于执行不返回数据的存储过程。它首先检查数据库连接是否打开,如果不是,则打开连接,然后执行存储过程。第二个方法Execute
用于执行返回数据的存储过程。它使用SqlDataAdapter
和DataSet
来填充返回的数据表。
在实际应用中,通常会创建继承自基础数据访问类的具体类,以实现特定业务逻辑。以下是如何定义和使用继承类的例子:
public class NewsMashupDB : Database, IDisposable
{
public NewsMashupDB() : base() { }
public NewsMashupDB(string ConnectionString) : base(ConnectionString) { }
public void CreateStory(string Headline, string Description, string Url, string Supplier, long PubDateValue)
{
SqlParameter paramHeadline = new SqlParameter("@Headline", SqlDbType.VarChar);
SqlParameter paramDescription = new SqlParameter("@Description", SqlDbType.VarChar);
SqlParameter paramUrl = new SqlParameter("@Url", SqlDbType.VarChar);
SqlParameter paramSupplier = new SqlParameter("@Supplier", SqlDbType.VarChar);
SqlParameter paramPubDate = new SqlParameter("@PubDateValue", SqlDbType.BigInt);
CommandText = "NewsMashup.CreateStory";
try
{
paramHeadline.Value = Headline;
paramDescription.Value = Description;
paramUrl.Value = Url;
paramSupplier.Value = Supplier;
paramPubDate.Value = PubDateValue;
dbCommand.Parameters.Clear();
dbCommand.Parameters.Add(paramHeadline);
dbCommand.Parameters.Add(paramDescription);
dbCommand.Parameters.Add(paramUrl);
dbCommand.Parameters.Add(paramSupplier);
dbCommand.Parameters.Add(paramPubDate);
Execute();
}
catch (System.Exception ex)
{
throw ex;
}
}
public DataTable RetrieveNewsFeeds()
{
DataTable dt = new DataTable();
try
{
CommandText = "NewsMashup.RetrieveNewsFeeds";
dt = Execute("NewsFeeds");
}
catch (System.Exception ex)
{
throw ex;
}
return dt;
}
}