DbSession(數據會話類)是數據操作的核心,所有數據庫的操作都通過它來完成,所以在編寫數據庫訪問層之前得實例化DbSession對象。
下面我們就來認識一下這個DbSession對象。
一、DbSession實例化配置
DbSession兩有種方式來進行實例化
1、通過配置文件創建
//指定connectionStrings節的名稱來實例化DbSession
public DbSession(string connectName);
這種方式一般用於已經配置好connectionStrings節的用戶,如下所示:
<connectionStrings>
<add name="DataExample" connectionString="Server=(local);Database=Northwind;Uid=sa;Pwd=sa;"
providerName="MySoft.Data.SqlServer9.SqlServer9Provider" />
</connectionStrings>
上面的配置節如果是Web項目,則在web.config中指定,如果是winform項目,則在app.config中的指定
後面的providerName指定數據庫鏈接所使用的驅動。
上面的配置方式只針對.net已經支持的驅動,如Access,SqlServer,Oracle
默認程序集為MySoft.Data.dll
如果是MySql,Firebird,SQLite需要額外的程序集支持,就需要按如下配置:
<connectionStrings>
<add name="DataExample" connectionString="Server=(local);Database=Northwind;Uid=sa;Pwd=sa;"
providerName="MySoft.Data.MySql.MySqlProvider, MySoft.Data.MySql" />
</connectionStrings>
providerName的寫法是前面className,後面跟assemblyName。
而且需要添加相關的驅動,如:MySql需要添加MySql.Data.dll與MySoft.Data.MySql.dll
2、通過動態創建DbProvider
//通過創建驅動的方式來實例化DbSession
public DbSession(DbProvider dbProvider);
這種方式一般用於需要動態創建會話對象的用戶
DbProvider是一個抽象類,用戶還可以自行擴展此驅動。
動態創建DbProvider來實例化DbSession會話:
A、可以傳入connectionName來創建驅動,此時connectionName配置節可以不用寫providerName;
DbProvider provider = ProviderFactory.CreateDbProvider("DataExample", ProviderType.SqlServer9);
DbSession DataExample = new DbSession(provider);
B、通過傳入connectionString來創建驅動,內部ProviderType枚舉已經將支持的驅動羅列出來。
DbProvider provider = ProviderFactory.CreateDbProvider(ProviderType.SqlServer9,
"Server=(local);Database=Northwind;Uid=sa;Pwd=sa;");
DbSession DataExample = new DbSession(provider);
C、如果是用戶自已實現的驅動,可以通過第三種方式來創建驅動。
DbProvider provider = ProviderFactory.CreateDbProvider(string assemblyName, string className,
string connectionString);
DbSession DataExample = new DbSession(provider);
不過對於一般用於,通過內置的驅動已經完全夠用了。
二、DbSession自定義實例化
DbSession實例化有兩種方式,直接實例化DbSession,如果內置的DbSession.Default就是其中一種。
DbSession.Default:
這是DbSession內部一個靜態的DbSession對象,默認創建自connectionStrings中的最後一個配置節中的數據庫鏈接,如果providerName為空,將默認為SqlServer2000.
下面就講一下如何來實例化DbSession來進行數據的訪問
新建一個MySoftExample.Web項目。
然後新建一個DataAccess的類,用來進行數據的訪問類,名字可以自己定義。
講解也比較費事,直接貼上代碼:
實例化DbSession
/// <summary>
/// 數據庫訪問類
/// </summary>
public static class DataAccess
{
/// <summary>
/// 通過配置節來實例化DbSession
/// </summary>
public static readonly DbSession DefaultSession = new DbSession("DataExample");
/// <summary>
/// 通過自定義類來實例化DbSession
/// </summary>
public static readonly DataExample ExampleSession = new DataExample();
}
/// <summary>
/// DataExample會話類
/// </summary>
public class DataExample : DbSession
{
public DataExample()
: base("DataExample")
{
this.RegisterSqlLogger(log =>
{
System.IO.File.WriteAllText("c:\\log.txt", log);
});
}
}
進行以上配置後,用戶可以有三種方式來操作數據,效果都一樣的:
只不過ExampleSession操作數據庫會寫日志到c:\\log.txt文件。
User user = new User() { name = “張三"" };
DbSession.Default.Save(user);
DataAccess.DefaultSession.Save(user);
DataAccess.ExampleSession.Save(user);
通過繼承可以很方便的實現注冊寫日志事件。而且對外顯示的名字為DataExample,這樣是否顯得更加清晰和雅觀呢。
如果不需要寫日志,將注冊事件的代碼注釋掉即可,還有一種方式是通過宏的方式,如下:
注冊日志事件
/// <summary>
/// DataExample會話類
/// </summary>
public class DataExample : DbSession
{
public DataExample()
: base("DataExample")
{
#if DEBUG
this.RegisterSqlLogger(log =>
{
System.IO.File.WriteAllText("c:\\log.txt", log);
});
#endif
}
}
這樣在Release模式下注冊事件的代碼將失效,這樣便於在Debug模式下調試,發布時就不需要寫日志了。
DbSession的配置就講解到這裡,下一章將講述如何使用DbSession來進行數據插入操作!