c 反射封裝SQL

2021-06-27 00:53:13 字數 3537 閱讀 9507

自己寫了一段程式,練習一下使用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的為例,有乙個引數,這個引數是我們不知道型別和屬性及值的實體,我們可以用泛型,也...