時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
一個(gè)系統(tǒng)執(zhí)行一個(gè)數(shù)據(jù)操作的步驟:
1.連接數(shù)據(jù)庫(kù)。
2.構(gòu)建Sql 語(yǔ)句。
3.執(zhí)行語(yǔ)句。
4.返回 執(zhí)行結(jié)果。
注:
一個(gè)系統(tǒng)可能有 N 個(gè)操作 ,然后另一個(gè)系統(tǒng)也要執(zhí)行數(shù)據(jù)訪問(wèn)操作,那么我們可以不可以把連接數(shù)據(jù)、庫(kù)執(zhí)行語(yǔ)句、返回結(jié)果
寫成一個(gè)公共的東西呢? 答案是一定的。例如:NHibernate 我們只要引用它的類庫(kù)、配置數(shù)據(jù)庫(kù)連接語(yǔ)句和Mapping 文件 就可以
進(jìn)行操作了。那我今天說(shuō)的是 不用寫配置文件 的一個(gè) 公用數(shù)據(jù)庫(kù)操作類庫(kù)。暫時(shí)只實(shí)現(xiàn)查詢
首先我們編寫一個(gè)接口:
IDataProvider
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using System.Data;
namespace CustomDataOperate.Data.DataProviders
{
public interface IDataProvider
{
DbConnection OpenConnection();
void Open();
void Close();
IDataReader ExecuteReader(string sql);
int ExecuteNonQuery(string sql);
ICollection
}
}
DbConnection OpenConnection(); 打開(kāi)一個(gè)數(shù)據(jù)庫(kù)連接
void Open(); 當(dāng)連接為關(guān)閉狀態(tài)時(shí) 再次打開(kāi)連接
void Close(); 關(guān)閉連接
IDataReader ExecuteReader(string sql); 執(zhí)行Sql 語(yǔ)句返回執(zhí)行結(jié)果
int ExecuteNonQuery(string sql); 執(zhí)行 修改、刪除、增加
ICollection
然后為接口寫一個(gè)抽象類:
DataProviderBase
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using CustomDataOperate.Data.Translates;
using System.Data;
namespace CustomDataOperate.Data.DataProviders
{
public abstract class DataProviderBase : IDataProvider
{
protected DbConnection _Connection;
protected DbCommand _Command;
protected IEntityTranslate _Translate;
#region IDataProvider Members
public abstract DbConnection OpenConnection();
public virtual void Close()
{
_Connection.Close();
}
public virtual void Open()
{
_Connection.Open();
}
protected virtual DbCommand Command
{
get { return _Command; }
set { _Command = value; }
}
protected IEntityTranslate Translate
{
get
{
if (_Translate == null)
{
_Translate = new EntityTranslate();
}
return _Translate;
}
}
public abstract IDataReader ExecuteReader(string sql);
public abstract int ExecuteNonQuery(string sql);
public abstract ICollection
#endregion
}
?
在 DataProviderBase 中出現(xiàn)了 Translate 屬性 他是什么呢 ? 他是一個(gè) (IEntityTranslate) 轉(zhuǎn)換器
將IDataReader 轉(zhuǎn)換為Entity
代碼如下:
IEntityTranslate
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace CustomDataOperate.Data.Translates
{
public interface IEntityTranslate
{
TEntity Translate
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MD = CustomDataOperate.Data.Attributes;
using System.Reflection;
namespace CustomDataOperate.Data.Translates
{
public class EntityTranslate:IEntityTranslate
{
public TEntity Translate
{
Type entityType = typeof(TEntity);
object entity = Activator.CreateInstance(entityType);
foreach (PropertyInfo info in entityType.GetProperties())
{
string columnName = string.Empty;
object[] attributes = info.GetCustomAttributes(true);
foreach (object attribute in attributes)
{
if (attribute is MD.DataColumn)
{
columnName = (attribute as MD.DataColumn).ColumnName;
int filedIndex = 0;
while (filedIndex < reader.FieldCount)
{
if (reader.GetName(filedIndex) == columnName)
{
info.SetValue(entity, reader.GetValue(filedIndex), null);
break;
}
filedIndex++;
}
break;
}
}
}
return entity as TEntity;
}
}
}
為什么轉(zhuǎn)換器中會(huì)出現(xiàn) DataColumn 是 System.Data 命名空間下的嗎? 不是 這是一個(gè)自定義的 Attirbute
DataColumn
using System;
using System.Collections.Generic;
using System.Text;
namespace CustomDataOperate.Data.Attributes
{
public class DataColumn : System.Attribute
{
public DataColumn()
{
}
public DataColumn(string columnName)
{
ColumnName = columnName;
}
public string ColumnName
{
get;
set;
}
}
}
注釋:
ColumnName :將數(shù)據(jù)庫(kù)的Filed 和 Entity Property 對(duì)應(yīng)。
到這里還要做什么呢? 對(duì)了還缺少實(shí)現(xiàn),那么我們開(kāi)始實(shí)現(xiàn)這個(gè) Provider
SqlDataProvider
using System;
using System.Collections.Generic;
using System.Text;
using CustomDataOperate.Data.DataProviders;
using System.Da
關(guān)鍵詞標(biāo)簽:數(shù)據(jù)庫(kù)
相關(guān)閱讀
熱門文章 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表?yè)p壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系
人氣排行 配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫(kù) SQL2000數(shù)據(jù)庫(kù)遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫(kù)服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級(jí)到2000的正確操作步驟 sql server系統(tǒng)表?yè)p壞的解決方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法