iT邦幫忙

DAY 22
1

Kuick Application & ORM Framework系列 第 22

Kuick -- 資料庫抽象提供者

  • 分享至 

  • twitterImage
  •  

資料庫抽象類別永遠是資料層的主角,雖然只有包含 3 個類別,卻是實作中最為抽象的部份。

  1. Kuick.Data.SqlReader 資料流讀取器
  2. Kuick.Data.SqlBuilder 資料指令生成器
  3. Kuick.Data.SqlDatabase 資料庫抽象類別
    只要補足這 3 個類別裡抽象成員,就能實作出支援另一種關連式資料庫,甚至是可以將檔案系統模擬成資料庫 (講遠了~)。
    資料庫抽象類別包含 SqlBuilder, SqlDatabase, SqlReader,本文僅說明實作內容,至於是使用那些設計模式完成的,就留待以後再談吧!

<Kuick.Data.SqlReader 資料流讀取器>

SqlReader 主要用以包覆資料庫提供者實作 System.Data.IDataReader 介面的資料流讀取器類別,並對應其各種方法,建立一對一的功能,例如 Read, Close, IsDBNull, GetOrdinal 以及各種資料類型的讀取方法 (GetInteger, GetLong, GetShort, GetString, GetDateTime, GetFloat, GetDouble, GetDecimal, GetByte, GetBytes, GetValue),其中有幾種資料型態值的處理內容值得一提的:
1). Boolean 布林值
Entity 裡的布林值 property,在資料庫裡的標準作法是以 bit (以 MSSql 為例) 格式儲存欄位值,但是在過往專案經驗裡,時常發現資料庫裡卻儲存成文字格式,可能以文字的 True, T, Yes, Y, 1 代表布林值的 true 值,以 False, F, No, N, 0 代表布林值的 false 值,為了相容於過往的錯誤設計,特別對於布林值的判斷進行額外處理。

2). Enum 列舉
物件裡的列舉 property,在資料庫裡儲存為文字型態,在 Bind 方法裡有針對列舉資料特別處理。

3). Color 顏色
物件裡的顏色 property,在資料庫裡儲存為數字型態。

4). HTML 字串
HTML 字串存在資料庫裡是經過 HtmlEncode 的值,取出時自動套用 HtmlDecode。

SqlReader 類別被使用於 SqlDatabase 類別裡進行資料轉成物件的處理,由 SqlReader 的 Bind 方法將資料轉成物件。在資料繫結處理的最後部份,特別針對後續會提及的『Kuick -- Entity 實作支援 dynamic』的功能,預作準備。

<Kuick.Data.SqlBuilder 資料指令生成器>

SqlBuilder 負責定義各類資料庫之間的差異,以及因應 ORM 裡的特殊處理 (Sql 物件化的相關類別)。執行期,Sql 與 SqlBuilder 一同交予 Sql 物件解析器 (SqlParser,下一篇即將分享的主題),結果產出相關的資料庫操作指令文字與參數。
1. 資料庫差異定義
以 MSSql 為例:
關鍵字前引號 -- [
關鍵字後引號 -- ]
資料引號 -- '
Unicode 前置標示 -- N
長文字欄位 null 值 -- NULL。在 Oracle 裡需執行內建函數 empty_clob()
參數前綴詞 -- @
參數後綴詞 -- 無

2. 指令生成器
處理 Sql 物件相關的類別,協助 SqlParser 將其轉成 Sql Command 字串。處理的 Sql 類別包含 SqlLiteral, SqlExpression, Sql, Column, SqlSet, SqlOrderBy, EntityIndex。

<Kuick.Data.SqlDatabase 資料庫抽象類別>

這是目前為止實作過最複雜的泛型類別,僅先條列出各個方法名稱與簡短說明,更詳細再找機會說明:
IDbConnection 資料庫連線類別
IDbTransaction 資料交易類別
IDbCommand 資料指令類別
IDbDataAdapter 資料連接器類別
IDataReader 資料流讀取器類別
SqlReader<R> where R : IDataReader 抽象資料流讀取器類別
1. 資料庫規格讀取與設定
GetDatabaseVersion 取資料庫版本資訊
GetTableNames 取得所有資料表名稱
GetViewNames 取得所有檢視表名稱
GetIndexNames 取得特定資料表所有索引名稱
CheckTableExists 檢查特定資料表是否存在
HasDBColumn 檢查特定資料欄位是否存在
AlterableColumn 檢查特定資料欄位是否可修改
ColumnSpecChanged 檢查特定資料欄位規格是否改變
CreateTable 建立資料表
CreateIndexes 建立索引
DropIndexes 刪除索引
SyncColumns 同步欄位

2. 資料 CRUD
Select 選取
AggregateSelect 聚合選取
DistinctSelect 排除相同的選取
DistinctDateSelect 特定日期部份的選取
CountSelect 筆數計算
Insert 新增
Update 修改
Delete 刪除
ExecuteNonQuery 不回傳的指令執行
ExecuteQuery 有回傳的指令執行
ExecuteStoredProcedure 執行指令預儲程序
ExecuteScalar 取回查詢結果第一筆第一個欄位值

========================================
鐵人賽分享列表:Kuick Application & ORM Framework
開放原始碼專案:kuick.codeplex.com
直接下載原始碼:Kuick
下載相關文件檔:C# Code Conventions and Design Guideline
相關教學影片區:Kuick on YouTube


上一篇
Kuick -- Sql Command 物件化
下一篇
Kuick -- Sql 物件解析器
系列文
Kuick Application & ORM Framework34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言