您的位置:首页 > 数据库

自己动手写ORM框架(二):AdoHelper支持多数据库操作的封装(1)

2010-05-16 20:39 393 查看
第一步:编写AdoHelper类,用于封装对数据库的操作,能同时支持多个数据库(目前支持SqlServer、Oracle、Access),可扩展支持任何类型的数据库。

下面先进行代码片段分析,分析完毕后将贴出完整代码,代码块1-1:

usingSystem;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingSystem.Configuration;
usingSystem.Text;
usingSystem.Data;
usingSystem.Data.Common;
usingSystem.Data.SqlClient;
usingSystem.Data.OracleClient;
usingSystem.Orm.Common;

namespaceSystem.Orm.DBUtility
{
publicclassAdoHelper
{
//获取数据库类型
privatestaticstringstrDbType=CommonUtils.GetConfigValueByKey("dbType").ToUpper();

//将数据库类型转换成枚举类型
publicstaticDatabaseTypeDbType=DatabaseTypeEnumParse<DatabaseType>(strDbType);
//获取数据库连接字符串
publicstaticstringConnectionString=GetConnectionString("connectionString");

//获取数据库命名参数符号,比如@(SQLSERVER)、:(ORACLE)
publicstaticstringDbParmChar=DbFactory.CreateDbParmCharacter();

(剖析Step1Begin)==================================================

代码块1-1中privatestaticstringstrDbType=CommonUtils.GetConfigValueByKey("dbType").ToUpper();使用到了CommonUtils.GetConfigValueByKey方法,通过读取传入的dbType字符串,到web.config配置文件中取出所配置的数据库类型,配置文件代码块1-2:

<?xmlversion="1.0"?>
<configuration>
<appSettings>
<addkey="dbType"value="oracle"/>
<addkey="connectionString"value="DataSource=test;UserID=test;Password=123"/>
</appSettings>
<system.web>
<compilationdebug="true">
</compilation>
<authenticationmode="Windows"/>
</system.web>
</configuration>

下面是CommonUtils.GetConfigValueByKey方法的实现代码块1-3:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Configuration;
usingSystem.Reflection;

namespaceSystem.Orm.Common
{
publicclassCommonUtils
{
//<summary>
//根据传入的Key获取配置文件中的Value值
//</summary>
//<paramname="Key"></param>
//<returns></returns>
publicstaticstringGetConfigValueByKey(stringKey)
{
try
{
returnConfigurationManager.AppSettings[Key].ToString();
}
catch
{
thrownewException("web.config中Key=\""+Key+"\"未配置或配置错误!");
}
}


(剖析Step1End)==================================================

(剖析Step2Begin)==================================================

代码块1-1中publicstaticDatabaseTypeDbType=DatabaseTypeEnumParse<DatabaseType>(strDbType);

这段代码是将在配置文件中取到的数据库类型字符串(比如:oracle)转换成已经定义的枚举类型,这里转换为DatabaseType枚举,DatabaseType代码块1-4:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;

namespaceSystem.Orm.DBUtility
{
//<summary>
//数据库类型枚举,需要扩展类型可在此添加
//</summary>
publicenumDatabaseType
{
SQLSERVER,
ORACLE,
ACCESS,
MYSQL
}
}


然后分析如何将字符串转换成枚举类型,用到DatabaseTypeEnumParse这个方法,代码块1-5:

//<summary>
//用于数据库类型的字符串枚举转换
//</summary>
//<typeparamname="T"></typeparam>
//<paramname="value"></param>
//<returns></returns>
publicstaticTDatabaseTypeEnumParse<T>(stringvalue)
{
try
{
returnCommonUtils.EnumParse<T>(value);
}
catch
{
thrownewException("数据库类型\""+value+"\"错误,请检查!");
}
}


这里实现枚举转换的功能来自CommonUtils.EnumParse<T>(value);代码块1-6:

//<summary>
//用于字符串和枚举类型的转换
//</summary>
//<typeparamname="T"></typeparam>
//<paramname="value"></param>
//<returns></returns>
publicstaticTEnumParse<T>(stringvalue)
{
try
{
return(T)Enum.Parse(typeof(T),value);
}
catch
{
thrownewException("传入的值与枚举值不匹配。");
}
}

上面代码是泛型的使用,在之前应用中:

DatabaseTypeDbType=DatabaseTypeEnumParse<DatabaseType(strDbType);

传入的DatabaseType枚举是这里的泛型T,传入的strDbType是这里的value,通过web.config中配置,

以及privatestaticstringstrDbType=CommonUtils.GetConfigValueByKey("dbType").ToUpper();,

我们可以得到strDbType=”ORACLE”;

然后回到代码块1-6中:return(T)Enum.Parse(typeof(T),value);

typeof(T)是得到枚举DatabaseType的类型,value是ORACLE,那么这里可以得到:

return(DatabaseType)Enum.Parse(typeof(DatabaseType),”ORACLE”);

这样最后我们可以得到DatabaseTypeDbType=DatabaseTypeEnumParse<DatabaseType>(strDbType);中DbType的值为DatabaseType.ORACLE,下面是这里在AdoHelper类中定义的DbType公有成员的用法:

//<summary>
//根据配置文件中所配置的数据库类型和传入的
//数据库链接字符串来创建相应数据库连接对象
//</summary>
//<paramname="connectionString"></param>
//<returns></returns>
publicstaticIDbConnectionCreateDbConnection(stringconnectionString)
{
IDbConnectionconn=null;
switch(AdoHelper.DbType)
{
caseDatabaseType.SQLSERVER:
conn=newSqlConnection(connectionString);
break;
caseDatabaseType.ORACLE:
conn=newOracleConnection(connectionString);
break;
caseDatabaseType.ACCESS:
conn=newOleDbConnection(connectionString);
break;
default:
thrownewException("数据库类型目前不支持!");
}

returnconn;
}


(剖析Step2End)==================================================

(剖析Step3Begin)==================================================

代码块1-1中publicstaticstringConnectionString=GetConnectionString("connectionString");中通过GetConnectionString(stringKey)方法在web.config配置文件中获取数据库连接字符串,配置文件中配置查看代码块1-2,GetConnectionString方法代码块1-7:

//<summary>
//根据传入的Key获取配置文件中
//相应Key的数据库连接字符串
//</summary>
//<paramname="Key"></param>
//<returns></returns>
publicstaticstringGetConnectionString(stringKey)
{
try
{
returnCommonUtils.GetConfigValueByKey(Key);
}
catch
{
thrownewException("web.config文件appSettings中数据库连接字符串未配置或配置错误,必须为Key=\"connectionString\"");
}
}


(剖析Step3End)==================================================

这里对代码块1-1已经剖析完毕,AdoHelper类中更多的代码剖析将在后面章节中相继完成。

下面是AdoHelper类的完整代码代码如下:

TypeUtils代码usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;

namespaceSystem.Orm.Common
{
publicclassTypeUtils
{
publicstaticobjectConvertForType(objectvalue,Typetype)
{
switch(type.FullName)
{
case"System.String":
value=value.ToString();
break;
case"System.Boolean":
value=bool.Parse(value.ToString());
break;
case"System.Int16":
case"System.Int32":
case"System.Int64":
value=int.Parse(value.ToString());
break;
case"System.Double":
value=double.Parse(value.ToString());
break;
case"System.Decimal":
value=newdecimal(double.Parse(value.ToString()));
break;
}

returnvalue;
}
}
}


数据库操作类代码基本如上全部。

Technorati标签:ORM
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: