//数据库访问的想法: //1.按照数据库表中的表定义一个接口,比如Customer-->ICustomer,Orders-->IOrders,Account-->IAccount // 示例代码[来自PetShop&Du7]: using System; namespace MySystem.IDAL { /// <summary> /// Inteface for the Account DAL /// </summary> public interface IAccount { /// <summary> /// Authenticate a user /// </summary> /// <param name="userId">Unique identifier for a user</param> /// <param name="password">Password for the user</param> /// <returns>Details about the user who has just logged in</returns> AccountInfo SignIn(string userId, string password); //AccountInfo 登录后返回的信息,数据量返回少的形式用这种格式 /// <summary> /// Retrieves a book for a specified Account id. /// <param name="AccountId">Id of Account to retrieve from database.</param> /// <retvalue>AccountData, a dataset containing detailed Account information.</retvalue> /// </summary> AccountData GetAccountById(int AccountId); //AccountData 根据查询得到的信息,信息数据量多并要由DataGrid显示时,用这种格式 /// <summary> /// Update an account in the database /// </summary> /// <param name="Account">Account information to update</param> void Update(AccountInfo Account);
} } //其它表的接口,和以上的类似 //2.定义工厂 //示例代码[来自PetShop&Du7]: using System; using System.Reflection; using System.Configuration;
namespace MySystem.DALFactory { /// <summary> /// Factory implementaion for the Account DAL object /// </summary> public class Account { public static MySystem.IDAL.IAccount Create() { /// Look up the DAL implementation we should be using string path = System.Configuration.ConfigurationSettings.AppSettings["DAL"]; string className = path + ".Account";
// Using the evidence given in the config file load the appropriate assembly and class return (MySystem.IDAL.IAccount) Assembly.Load(path).CreateInstance(className); } } } //3.实现接口 //示例代码[来自PetShop&Du7]: using System; using System.Data; using System.Data.SqlClient; using PetShop.Model; using MySystem.IDAL;
namespace MySystem.SQLServerDAL { /// <summary> /// Summary description for AccountDALC. /// </summary> public class Account : IAccount{
public Account(){ }
/// <summary> /// Verify the users login credentials against the database /// If the user is valid return all information for the user /// </summary> /// <param name="userId">Username</param> /// <param name="password">password</param> /// <returns></returns> public AccountInfo SignIn(string userId, string password) { return new AccountInfo(); }
/// <summary> /// Return the address information for a user /// </summary> /// <param name="userId"></param> /// <returns></returns> public AccountData GetAccountById(string accountId) { AccountData account= null; return account; }
/// <summary> /// Update an account in the database /// </summary> /// <param name="myAccount">Updated account parameters, you must supply all parameters</param> public void Update(AccountInfo myAccount) { }
} }
//4.定义表的DataSet
namespace MySystem.Data { using System; using System.Data; using System.Runtime.Serialization; public class AccountData : DataSet { public const String ACCOUNT_TABLE = "Accounts"; public const String PKID_FIELD = "PKId"; public const String ACCOUNTNAME_FIELD = "AccountName"; public enum SearchTypeEnum { /// <summary> /// Id search. /// </summary> ID = 0, /// <summary> /// AccountName search. /// </summary> AccountName = 1 } /// <summary> /// Constructor to support serialization. /// <remarks>Constructor that supports serialization.</remarks> /// <param name="info">The SerializationInfo object to read from.</param> /// <param name="context">Information on who is calling this method.</param> /// </summary> private AccountData(SerializationInfo info, StreamingContext context) : base(info, context) { } /// <summary> /// Constructor for AccountData. /// <remarks>Initialize a AccountData instance by building the table schema.</remarks> /// </summary> public BookData() { // // Create the tables in the dataset // BuildDataTables(); } //---------------------------------------------------------------- // Sub BuildDataTables: // Creates the following datatables: Account //---------------------------------------------------------------- private void BuildDataTables() { // // Create the Books table // DataTable table = new DataTable(ACCOUNT_TABLE); DataColumnCollection columns = table.Columns; columns.Add(PKID_FIELD, typeof(System.Int32)); columns.Add(ACCOUNTNAME_FIELD, typeof(System.Int32)); this.Tables.Add(table); } //定义表Info using System; namespace MySystem.Data {
/// <summary> /// Business entity used to model accounts /// </summary> [Serializable] public class AccountInfo {
// Internal member variables private string _Id; private string _accountname;
/// <summary> /// Default constructor /// </summary> public AccountInfo() { }
public AccountInfo(string Id, string accountname) this._Id = Id; this._accountname = accountname; }
// Properties public string AccountId { get { return _Id; } } public string AccountName { get { return _accountname; } } } } //5.前台调用 using MySystem.IDAL;
namespace MySystem.BLL {
public class Account { public AccountInfo SignIn(string userId, string password) {
// Validate input if ((userId.Trim() == string.Empty) || (password.Trim() == string.Empty)) return null;
// Get an instance of the account DAL using the DALFactory IAccount dal = PetShop.DALFactory.Account.Create();
// Try to sign in with the given credentials AccountInfo account = dal.SignIn(userId, password);
// Return the account return account; }
/// <summary> /// Returns the address information for a specific user /// </summary> /// <param name="userId">Unique identifier for an account/customer</param> /// <returns>Returns the address information for the user</returns> public AddressInfo GetAddress(string userId) {
// Validate input if (userId.Trim() == string.Empty) return null; // Get an instance of the account DAL using the DALFactory IAccount dal = PetShop.DALFactory.Account.Create();
// Return the address information for the given userId from the DAL return dal.GetAddress(userId); }
} }

|