AppFramework1.0數據庫訪問組件使用說明(四)基礎數據類型

 
爲了規避IBatisNet的空值問題,AppFramework不使用C#基本類型來構造實體類。AppFramework對C#基本類型作了簡單封裝,增加了一個是否有值的屬性來標誌字段值是否非空。
每一種基本的C#類型都有對應的DBValue對其進行封裝。
C#類型
DBValue類型
數據庫類型
byte
ByteValue
數字類型
short
ShortValue
數字類型
int
IntValue
數字類型
long
LongValue
數字類型
sbyte
SByteValue
數字類型
ushort
UShortValue
數字類型
ulong
ULongValue
數字類型
uint
UIntValue
數字類型
DateTime
DateTimeValue
日期時間
string
StringValue
Varchar/NVarchar 或
Text/CLOB類型
float
FloatValue
數字類型
double
DoubleValue
數字類型
decimal
DecimalValue
數字類型、金額
byte[]
BLOBValue
BLOB類型
 
1.1.2  DBValue的屬性方法
在AppFramework裏, DBValue主要用於構造數據庫的表實體類。代碼生成器爲每個數據表生成一個實體類,爲每個表字段生成一個子類化的DBValue屬性,並自動實現實體類的構造、賦值。測試數據表明,雖然DBValue構造的實體類比用C#基本類型構造的實體類要“重”一些,但其構造對象的性能比IBatis用反射的方式構造對象的性能還是高很多。
下表簡單列舉了DBValue的基本屬性和方法:
屬性/方法
類型
說明
HasValue
Bool
標誌字段是否有值,構造時初始化爲false
Object
Object
獲取或設置字段內部封裝的值,如果 HasValue 爲 false, 獲取時得到 null
DBObject
Object
獲取或設置字段內部封裝的值,如果 HasValue 爲 false, 獲取時得到 DBNull.Value;
如果設置 DBNull,則 HasValue 改變爲 false;
Value
封裝的C#類型
獲取字段值,HasValue 爲 false 時獲取 Value 值將獲得所封裝類型的默認值
ToString()
String
顯示爲文本,如果HasValue爲false,則返回string.Empty
Clear()
Void
把HasValue設置爲false,但清除Value
例如,IntValue 封裝了 int類型的數據庫字段,IntValue.HasValue表示是否有值,如果沒有值訪問IntValue.Value屬性會得到int的默認值。對無值的IntValue調用ToString()會得到空字符串。
正確的用法應該是先通過HasValue判斷是否有值,然後在訪問Value獲取值。
 
public BasUser GetUser(string fields, int id)
{
    // 獲得dao
    IBasUserDAO dao = DAOManager.Default.GetDAO<IBasUserDAO>();
    // 獲得數據庫會話
    using (IDBSession session = DBSessionManager.Default.GetSession())
    {
        return dao.Get(session, fields, id);//返回得到的實體,如果未找到記錄,返回null
    }
}
 
public void ShowUser(int userID)
{
         BasUser user = GetUser(userID);
         if (user != null)
         {
                  txtName.Text = user.Name.ToString();
                  txtAge.Text = user.Age.ToString();
         }
}
 
DBField封裝的基本目的是表達C#原始類型的所不能表達的“空值”、“默認值”、“表達式”等信息,其結構爲“字段名—操作符—表達式”,在AppFramework中主要用於插入和更新數據庫記錄時爲數據庫字段賦值或表達式。經過擴展,也適用於各一些表達 “字段名—操作符—表達式”結構的SQL語句片段,例如“字段名 in (select … from)”這樣的子查詢。
DBField封裝了各種通用的數據庫字段類型,如下表:
C#類型
DBField類型
數據庫類型
Object
DBField
通用類型
Byte
ByteField
數字類型
Short
ShortField
數字類型
Int
IntField
數字類型
Long
LongField
數字類型
Sbyte
SByteField
數字類型
Ushort
UShortField
數字類型
Ulong
ULongField
數字類型
uint
UIntField
數字類型
DateTime
DateTimeField
日期時間
string
StringField
Varchar/NVarchar
string
TextField
Text/CLOB類型
float
FloatField
數字類型
double
DoubleField
數字類型
decimal
DecimalField
數字類型、金額
byte[]
BLOBField
BLOB類型
注意:DBField比DBValue多了對兩種基礎類型的封裝,一個是DBField對object的封裝,另一個是TextField對CLOB/TEXT大文本字段的封裝。
1.1.4  DBField的屬性方法
下表簡單列舉了DBField的基本用法:
屬性/方法
類型
說明
FieldName
string
獲取或設置字段名
Operator
DBOperator
獲取或設置字段操作符,例如大於、小於、等於、in、like……等常用操作符,默認爲 Equal
Value
封裝的C#類型
獲取字段值,HasValue 爲 false 時獲取 Value 值將獲得所封裝類型的默認值
Expression
string
獲取或設置字段表達式
Flag
DBFieldFlag
獲取字段值狀態標誌,當標誌值爲NotSet時表示未設置值,標誌值爲Value 表示此對象的Value屬性有效; Expression表示此對象的Expression有效。默認爲 NotSet。
DataType
DataType
獲取或設置字段值類型
AsObject
object
以 object 方式獲取或設置字段值,如果 Flag爲 NotSet, 獲取時得到 null
SelectStatement
SelectStatement
獲取或設置字段的子查詢表達式
SetDefault()
void
設置字段爲其默認值
SetNull()
void
設置字段爲空值
Clear()
void
清除字段值或表達式,把Flag設置爲NotSet
ToString()
string
已重載。若Flag爲NotSet,返回string.Empty。若Flag爲Value,則返回Value.ToString()。若Flag爲Expression,則返回Expression。
 
爲了方便使用,提供了幾個靜態方法快速創建各種DBField:
方法
返回值
說明
CreateExpression
DBField
創建一個表達式,有多個重載,可以對各個屬性進行設置。
string fieldName:字段名
DataType t:字段類型
DBOperator op:表達式的操作符
string expression:表達式
CreateDefault
DBField
創建一個默認值字段
CreateNull
DBField
創建一個空值字段
Create
DBField
虛方法,子類將重載,創建一個子類DBField
 
通過IDBSession和DBFieldk可以輕鬆實現insert和update:
// 插入記錄insert
using (IDBSession session = DBSessionManager.Default.GetSession())
{
    // 插入記錄
session.Insert(
           “BAS_USER”,
           new DBField(“Name”, “王二”),
           new DBFieldI(“En_Name”, “Wanger”)
           ……
           new DBFieldI(“Age”, 26)
);
}
 
// 更新記錄update
using (IDBSession session = DBSessionManager.Default.GetSession())
{
         string updateCondition = “id = 100”;
    // 更新記錄
session.Update(
           “BAS_USER”,
           updateCondition,
           new DBField(“Name”, “王二”),
           new DBFieldI(“En_Name”, “Wanger”)
           ……
           new DBFieldI(“Age”, 26)
);
}
 
 
用IDBSession實現insert和update是一種高效的數據插入和更新方式,測試數據表明其性能超過iBatis的插入更新性能的60~100%。
爲了進一步簡化代碼,AppFramework採用生成DAO和參數實體類(由DBField組成的實體類)實現插入和更新。下列代碼中BasUserParam是一個參數實體類,其屬性均爲子類化的DBField,對其屬性賦值後傳給DAO的Insert或Update方法實現插入或更新:
// 構造用戶信息參數類
IBasUserParam user = new BasUserParam();
user.Name.Value = "MyBasName";
user.EnName.Value = "EnMyBasName" ;
user.CreatorID.Value = 0;
user.DeptID.Value = 100;
user.Email.Value = "Email";
user.EmployeeNo.Value = "EmployeeNO" ;
user.OrgID.Value = 0;
user.Password.Value = "Password";
user.State.Value = 0;
user.UpdatedBy.Value = 0;
user.Age.Value = 25;
user.LastUpdatedTime.SetDefault();
 
// 獲得dao
IBasUserDAO dao = DAOManager.Default.GetDAO<IBasUserDAO>();
// 獲得數據庫會話
using (IDBSession session = DBSessionManager.Default.GetSession())
{
dao.Insert(session, user); // 插入記錄
return user.ID.Value;//返回新用戶的ID
}
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章