毕设选题是“基于SaaS的数据库客户端”。网上有个开源的isqlweb给了我不少帮助,但是它并没有面向多数据库,且没有面向接口编程。为了满足多数据库类型的连接需求,我在接口中用到了泛型。如:
namespace Jxmstc.Sop.DbClient.IBLL
{
public interface IConnection<T>
{
T CreateConn(ConnectionInfo conInfo);
void OpenConn(T conn);
void CloseConn(T conn);
}
}
一、类型转换
其他类型转换为泛型
/// <summary>
/// 创建连接
/// </summary>
/// <param name="conInfo">自定义的类对象</param>
/// <returns>连接对象</returns>
public T CreateConn(ConnectionInfo conInfo)
{
SqlConnection sqlCon = new SqlConnection();
if (conInfo != null)
{
string strConn = string.Format("server={0};uid={1};pwd={2};database=master;Asynchronous Processing=true;"
, conInfo.Server.Replace(";", ""), conInfo.UserName.Replace(";", ""), conInfo.Pwd.Replace(";", ""));
sqlCon.ConnectionString = strConn;
}
object b=(object)sqlCon;
return (T)b;
}
看到了吧,我把SqlConnection对象转换为object,再转换为T。直接写(T)SqlCon,编译都通过不了。
泛型转换为其他类型
/// <summary>
/// 打开连接
/// </summary>
/// <param name="conn">连接对象</param>
public void OpenConn(T conn)
{
SqlConnection sqlconn=(object)conn as SqlConnection ;
if (sqlconn == null) return;
if(sqlconn .State!=ConnectionState .Open ){
sqlconn .Open ();
}
}
还是得通过object对象进行转换。
二、通过反射动态创建泛型对象
既然面向多数据库,当然有个DBFactory类啦。通过反射机制,找到相应的实现了IBLL的BLL命名空间中的类。一般的类,通过assembly+ClassName就可以反射,进行缓存处理。而泛型类则不然,即:
/// <summary>
/// 创建连接
/// </summary>
/// <typeparam name="T">连接对象类型 如:SqlConnection</typeparam>
/// <returns></returns>
public static IConnection<T> CreateConnnection<T>() {
Type type = typeof(Connection<T>);
object o=Activator .CreateInstance (type);
return (IConnection<T>)o;
}