最近在研究orm,嘗試著自己開發了乙個簡單的orm。我個人不喜歡ef因為跟不上ef公升級太快了,再說公司裡還停留在c# 3.5時代,對於nhibernate配置太複雜看到就頭暈,就心生自己做乙個orm的念頭,現在把開發過程中的點點滴滴記錄下來,供自己和新手參考,大神請直接忽略這篇文章。
create在這裡我建立一張表,其中userid是主鍵,為什麼不定義成自增長的呢?請保留這個疑問,繼續看下去。表建立好了,下面就是定義乙個類,如下:table
[dbo
].[user](
[userid][
int]
notnull
primary
key,
[email][
nvarchar
](100) null
,
[createdtime][
datetime
]null
)
public現在我們要對這個類寫乙個insert操作,直接傳入user物件然後插入到資料庫。我們要用系統自動構建sql語句,不需要手寫sql語句,在這我們先分析下insert into sql語句。class
user
public
string email
public datetime createdtime
}
insert我們需要知道表名、欄位名和值才能夠完成sql拼接,怎麼得到這些資訊呢,萬能的反射該出場。into
表名 (欄位1
,欄位2
,欄位3...)
values
值1, 值2,
值3...
string classname = typeof執行結果如下(user).name;
console.writeline(
"類名:
", classname);
console.writeline(
"-----獲取屬性資訊-----");
var properties = typeof
(user).getproperties();
foreach (var item in
properties)
",item.name);
}console.writeline(
"-----end-----
");
look,user類的資訊都顯示出來了,屬性的值該如何顯示?也就是sql語句的value,還是要靠萬能的反射,請看官門繼續往下看。
string classname = typeof(user).name;
console.writeline(
"類名:
類名、屬性名、屬性值我們都得到了,那下面要做的就是拼寫sql語句了
為避免sql注入,我把sql改成引數的資訊
insert修改後的c#**into
表名 (欄位1
,欄位2
,欄位3...)
values
@p1,
@p2,
@p3...
publicview codestatic
void
main());}
public
static
int pritparametersql(t user)
") values (");
for (int i = 0; i < properties.length; i++)
")");
console.writeline(sql);
sqlconnection conn = new
sqlconnection(connectionstring);
var cmd =conn.createcommand();
cmd.commandtext =sql.tostring();
foreach (var item in
parameters)
conn.open();
return
cmd.executenonquery();
}
執行後的結果
還記得前面提到為什麼userid不設定成自增長嗎?因為這種單純的反射無法識別哪個是自增長字段,如果想用自增長主鍵怎麼辦?請看後續文章。
一步步實現自己的ORM(五)
讓我們先來看下expression 表示式如何將datareader轉換成object idatareader reader null expression expr r new user var func expr.compile func reader 在new user的時候採用物件初始化方式...
自己怎麼一步步喜歡程式設計
在夜深人靜的時候我整理一下思緒 自己當年是如何從愛玩遊戲的小孩子一步步成長為一名熱愛程式設計的程式設計師。1 玩電腦 要程式設計就要觸到電腦,我喜歡電腦原因很簡單,我喜歡玩遊戲。一開始家裡沒電腦就跑去親戚家玩。人們都說玩遊戲是學電腦最慢 最傻的辦法。但是我必須要再新增一句 也是最有效的辦法。乙個事物...
一步步學ROS
最近因為看svo的 裡面用到catkin決定要好好看ros,年前學會基本操作。啟動節點 rosrun package name executable name 檢視節點 rosnode list 注 rosout 節點是乙個特殊的節點,通過 roscore 自動啟動 檢視特定節點的資訊 rosnod...