自己寫了一段程式,練習一下使用c#封裝sql語句。
namespace model
#region 更新
virtual public int updatebykey()
// 獲得更新的sql語句
private string getupdatebykeysql()
set where = ''";
string keyfiled, keyvalue;
if (getprimarykeyinfo(out keyfiled, out keyvalue))
else
}/// /// 獲得更新資料庫的sql欄位和值
///
/// 更新資料庫的部分字串
private string getupdatefieldandvaluestring()
if (!string.isnullorempty(strupdatevalue))
return strupdatevalue;
}#endregion
/// /// 初始化要處理的字段的資料庫字段以及值
///
/// 列舉值
/// 特性的說明
private void getdbfieldandvalue()
// 主鍵不用參與處理
if (v[0].primarykey)
// 如果該字段的值為空,無需處理
if (item.getvalue(this) == null)
string value = item.getvalue(this).tostring();
_updatefiled.add(fieldname);
_valuefiled.add(value);}}
/// /// 獲得主鍵對應的值,暫時沒有好辦法,先用笨辦法獲得吧
///
/// 獲得主鍵對應的值
private bool getprimarykeyinfo(out string filed, out string value)
// 如果是主鍵,獲得欄位名稱和值
if (v[0].primarykey)
}value = "";
filed = "";
return false;
}#region 插入
/// /// 插入資料庫操作
///
/// 成功:所影響的行數;sql語句不正確:-1
virtual public int insert()
return dbhelper.executenonquery(sql);
}/// /// 插入資料庫的sql
///
/// 插入操作的sql語句
private string getinsertsql()
() values ()";
getdbfieldandvalue();
string strfield = string.join(",", _updatefiled.toarray());
string strvalue = string.join(",", addquotationtoelm(_valuefiled).toarray());
// 如果插入的字段或者結果為空,不能插入。其它校驗先不搞了……
if (string.isnullorempty(strfield) || string.isnullorempty(strvalue))
return string.format(insertsql, _tbname, strfield, strvalue);
}/// /// 為list的每乙個元素新增單引號
///
/// 新的list
private listaddquotationtoelm(liststrlist)
return temp;
}#endregion
list_updatefiled;// 要處理的字段
list_valuefiled;// 要處理的值。兩個是一一對應的
protected string _tbname;
//virtual string _keyvalue;
}// 儲存字段屬性,這裡主要儲存資料庫欄位名稱
public class dbmodelattribute : attribute
public bool primarykey
}}
以上是基類,建立資料表實體類,繼承它,就可以忽略sql語句完成增加和根據id更新的操作
如:
public class projectoccasionmaterial : dbmodel
[dbmodelattribute(filedname = "materialid", primarykey = true)]// id屬性以後要校驗,只能有乙個
public string materialid;
[dbmodelattribute(filedname = "materialname")]
public string materialname;
[dbmodelattribute(filedname = "materialtype")]
public string materialtype;
[dbmodelattribute(filedname = "materialstatus")]
public string materialstatus;
[dbmodelattribute(filedname = "opinion")]
public string opinion;
[dbmodelattribute(filedname = "nominatedname")]
public string nominatedname;
[dbmodelattribute(filedname = "occasionid")]
public string occasionid;
[dbmodelattribute(filedname = "materialremark")]
public string materialremark;
}
建立了以上實體類後,就可以通過json反序列化,將客戶端傳來的資料生成這個實體類,然後做好業務校驗之後就可以直接呼叫它的資料庫操作,比如:
projectoccasionmaterial prjocmtrmodel = jsonhelper.jsondeserialize(model);
這裡業務函式可以自己隨便寫
int rst = prjocmtrmodel.updatebykey();
以上,就是自己對資料庫封裝的一些嘗試,還存在很多問題,主要如下:
1、只能進行簡單的update和insert操作,並且update還只能根據主鍵進行;
2、如果要更新為null或「」是不能實現的,會忽略;
3、複雜的sql語句比如join之類的也無法處理。
還望大神指點。
通過反射封裝JDBC
具體上 我的basedao 每個實體類都配置了個properties 用來存放每個實體類的類名 相當於資料庫裡的表明 和資料庫裡的主鍵自動增長列 tablename user mainkeytype identity idname id 我的userdao只要繼承basedao就行 public c...
Day3 1 反射機制 反射封裝
反射修改或者呼叫方法和屬性過程太複雜,通過beanutils類對訪問控制進行封裝,可以簡化 實現。beanutils.getproperty obj,college 獲取obj物件的college屬性值 beanutils.setproperty obj,college 清華 設定obj物件的col...
C 如何利用反射構建Sql引數
首先呢,說到這個問題我們要知道泛型的概念,泛型呢你可以把它當成乙個引數,就是呼叫的時候傳入這個型別,接著就是獲取這個型別裡的所有屬性及值。我們先來建立乙個方法名getmysqlparame的方法,當然我這裡是以mysql的為例,有乙個引數,這個引數是我們不知道型別和屬性及值的實體,我們可以用泛型,也...