日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NHibernateLinq简单的CRUD操作

發布時間:2025/7/14 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NHibernateLinq简单的CRUD操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????? 因為最近在做一些有關數據庫方面的開發,其實,說白了,就是對數據庫的CRUD操作,寫了n多的存儲過程,倒不是說存儲過程多難,關鍵是在后期的維護方面有點頭疼,沒辦法,研究一下ORM吧。

????? 下面分別是用NHibernate和Linq實現的簡單的CRUD操作,當是一開始的練練手(開關環境:VS08+SQL2000)。

?????? ①:NHibernate

???????不管三七二十一,先看看實體類吧。(數據庫代碼省略,映射文件對應著表結構)??

代碼 ????public?class?User
????{
????????
#region?構造函數
????????
///?<summary>
????????
///?用戶信息
????????
///?</summary>
????????public?User()?{?}
????????
#endregion

????????
#region?屬性

????????
private?int?userID;
????????
///?<summary>
????????
///?用戶ID
????????
///?</summary>
????????public?virtual?int?UserID
????????{
????????????
get
????????????{
????????????????
return?userID;
????????????}
????????????
set
????????????{
????????????????userID?
=?value;
????????????}
????????}

????????
private?string?userName;
????????
///?<summary>
????????
///?用戶姓名
????????
///?</summary>
????????public?virtual?string?UserName
????????{
????????????
get
????????????{
????????????????
return?userName;
????????????}
????????????
set
????????????{
????????????????userName?
=?value;
????????????}
????????}

????????
private?string?userPwd;
????????
///?<summary>
????????
///?用戶密碼
????????
///?</summary>
????????public?virtual?string?UserPwd
????????{
????????????
get
????????????{
????????????????
return?userPwd;
????????????}
????????????
set
????????????{
????????????????userPwd?
=?value;
????????????}
????????}

????????
private?int?userAge;
????????
///?<summary>
????????
///?用戶年齡
????????
///?</summary>
????????public?virtual?int?UserAge
????????{
????????????
get
????????????{
????????????????
return?userAge;
????????????}
????????????
set
????????????{
????????????????userAge?
=?value;
????????????}
????????}
????????
#endregion
????}

?

????? 這里用的NHibernate是NHibernate-2.1.2.GA-bin,映射文件如下(注意映射文件中nh的版本號):

代碼 <?xml?version="1.0"?encoding="utf-8"??>
<hibernate-mapping?xmlns="urn:nhibernate-mapping-2.2"?>
??
<class?name="NHUser.User,NHUser"?table="UserInfo">?//NHUser為命名空間、UserInfo為數據表名
????
<id?name="UserID"?type="Int32"?unsaved-value="null">
??????
<column?name="UserID"?length="4"?sql-type="int"?not-null="true"?unique="true"?index="PK_UserInfo"/>
??????
<generator?class="native"/>
????
</id>
????
<property?name="UserName"?type="String">
??????
<column?name="UserName"?length="50"?sql-type="nvarchar"?not-null="false"/>
????
</property>
????
<property?name="UserPwd"?type="String">
??????
<column?name="UserPwd"?length="50"?sql-type="nvarchar"?not-null="false"/>
????
</property>
????
<property?name="UserAge"?type="Int32">
??????
<column?name="UserAge"?length="4"?sql-type="int"?/>
????
</property>
??
</class>
</hibernate-mapping>

?

????? 基本工作還剩下個配置文件hibernate.cfg.xml

代碼 <?xml?version="1.0"?encoding="utf-8"??>
<hibernate-configuration?xmlns="urn:nhibernate-configuration-2.2">
??
<session-factory>
????
<property?name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
????
<property?name="connection.connection_string">Server=localhost;uid=sa;pwd=123456;database=NunitUser;Integrated?Security=SSPI</property>
????
<property?name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>
????
<property?name="adonet.batch_size">100</property>
????
<property?name='proxyfactory.factory_class'>
??????NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle
????
</property>
????
<mapping?assembly="NHUser"/>
??
</session-factory>
</hibernate-configuration>

?

????? OK!準備工作over了,下面看看CRUD的操作代碼吧

代碼 namespace?NHUser
{
????
public?partial?class?NHCRUD?:?Form
????{
????????
public?NHCRUD()
????????{
????????????InitializeComponent();
????????}

????????
private?void?btnOK_Click(object?sender,?EventArgs?e)
????????{
????????????
try
????????????{
????????????????
string?username?=?this.tbUserName.Text.ToString();
????????????????
string?userpwd?=?this.tbUserPwd.Text.ToString();
????????????????
int?userage?=?Convert.ToInt32(this.tbUserAge.Text.ToString());

????????????????
//定義配置文件
????????????????Configuration?cfg?=?new?Configuration();
????????????????cfg.Configure();

????????????????
//創建會話工廠
????????????????ISessionFactory?factory?=?cfg.BuildSessionFactory();
????????????????ISession?session?
=?factory.OpenSession();
????????????????
//用戶賦值
??????????????? User?user?=?new?User();
????????????????user.UserName?
=?username;
????????????????user.UserPwd?
=?userpwd;
????????????????user.UserAge?
=?userage;

????????????????
//開啟事務
????????????????ITransaction?trans?=?session.BeginTransaction();
????????????????
try
????????????????{
????????????????????session.Save(user);
????????????????????//Commit
????????????????????trans.Commit();
????????????????????MessageBox.Show(
"用戶數據插入成功!",?"系統提示!");
????????????????????
this.Close();
????????????????}
????????????????
catch?(Exception?ex)
????????????????{
????????????????????trans.Rollback();
????????????????????MessageBox.Show(
"用戶數據插入失敗!"?+?ex.Message,?"系統提示!");
????????????????}
????????????}
????????????
catch?(Exception?ex)
????????????{
????????????????MessageBox.Show(ex.Message,?
"錯誤提示!");
????????????}
????????}

????????
///?<summary>
????????
///?查詢指定數據
????????
///?</summary>
????????private?void?btnRead_Click(object?sender,?EventArgs?e)
????????{
????????????
//定義配置文件
????????????Configuration?cfg?=?new?Configuration();
??????????? cfg.Configure();
????????????
//創建會話工廠
????????????ISessionFactory?factory?=?cfg.BuildSessionFactory();
????????????
using?(ISession?session?=?factory.OpenSession())
????????????{
????????????????IList?users?
=?session.CreateCriteria(typeof(User)).Add(Expression.Eq("UserName",?"dukeyongwang")).List();

????????????????
foreach?(User?user?in?users)
????????????????{
????????????????????Console.WriteLine(
"UserID:"?+?user.UserID?+?"——>UserName:"?+?user.UserName?+?"——>UserPwd:"?+?user.UserPwd?+?"——>UserAge:"?+?user.UserAge);
????????????????}
????????????}
????????}

????????
///?<summary>
????????
///?修改
????????
///?</summary>
????????private?void?btnUpdate_Click(object?sender,?EventArgs?e)
????????{
????????????
//定義配置文件
????????????Configuration?cfg?=?new?Configuration();
????????????cfg.Configure();
????????????
//創建會話工廠
????????????ISessionFactory?factory?=?cfg.BuildSessionFactory();

????????????
try
????????????{
????????????????
using?(ISession?session?=?factory.OpenSession())
????????????????{
????????????????????User?user?
=?session.Load(typeof(User),?5)?as?User;

????????????????????Console.WriteLine(
"修改前==>>UserID:"?+?user.UserID?+?"——>UserName:"?+?user.UserName?+?"——>UserPwd:"?+?user.UserPwd?+?"——>UserAge:"?+?user.UserAge);

????????????????????user.UserName?
=?"dukeyongwang";
????????????????????user.UserPwd?
=?"dkwang";
????????????????????user.UserAge?
=?25;

????????????????????
using?(ITransaction?trans?=?session.BeginTransaction())
????????????????????{
????????????????????????session.Update(user,?user.UserID);

????????????????????????User?updateUser?
=?session.Load(typeof(User),?user.UserID)?as?User;

????????????????????????
//修改后
????????????????????????Console.WriteLine("修改后==>>UserID:"?+?updateUser.UserID?+?"——>UserName:"?+?updateUser.UserName?+?"——>UserPwd:"?+?updateUser.UserPwd?+?"——>UserAge:"?+?updateUser.UserAge);

????????????????????????trans.Commit();
????????????????????}
????????????????}
????????????}
????????????
catch?(Exception?ex)
????????????{
????????????????MessageBox.Show(
"修改時錯誤:"?+?ex.Message,?"錯誤提示!");
????????????}
????????}


????????
///?<summary>
????????
///?刪除(可通過查詢出來的實體對象,然后刪除)
????????
///?</summary>
????????private?void?btnDel_Click(object?sender,?EventArgs?e)
????????{
???????????
//定義配置文件
????????????Configuration?cfg?=?new?Configuration();
???????????cfg.Configure();
???????????
//創建會話工廠
????????????ISessionFactory?factory?=?cfg.BuildSessionFactory();

????????????
using?(ISession?session?=?factory.OpenSession())
????????????{
????????????????
using?(ITransaction?trans?=?session.BeginTransaction())
????????????????{
????????????????????User?newUser?
=?session.Load(typeof(User),?6)?as?User;
????????????????????
//刪除
????????????????????session.Delete(newUser);
????????????????????
????????????????????trans.Commit();
????????????????}
????????????}
????????}
????}
}

?

???? 運行以上代碼,就可以實現數據的CRUD,感覺沒有SQL,代碼清爽了許多。呵呵。。。。

???? ②:Linq

???? 在linq中少了NHibernate的映射文件,這部分實現在實體類中通過TableAttribute和ColumnAttribute實現,少建一個xml文件,也許你會說,現在的映射文件可以自動生成,好吧,我承認的確是可以。

代碼 [Table(Name="UserInfo")]
????
public?class?User
????{
????????
private?int?userID;
????????
///?<summary>
????????
///?用戶ID
????????
///?</summary>
????????[Column(DbType="int",IsPrimaryKey=true,IsDbGenerated=true)]
????????
public?int?UserID
????????{
????????????
get
????????????{
????????????????
return?userID;
????????????}
????????????
set
????????????{
????????????????userID?
=?value;
????????????}
????????}

????????
private?string?userName;
????????
///?<summary>
????????
///?用戶姓名
????????
///?</summary>
????????[Column(DbType="nvarchar(50)")]
????????
public?string?UserName
????????{
????????????
get
????????????{
????????????????
return?userName;
????????????}
????????????
set
????????????{
????????????????userName?
=?value;
????????????}
????????}

????????
private?string?userPwd;
????????
///?<summary>
????????
///?用戶密碼
????????
///?</summary>
????????[Column(DbType="nvarchar(50)")]
????????
public?string?UserPwd
????????{
????????????
get
????????????{
????????????????
return?userPwd;
????????????}
????????????
set
????????????{
????????????????userPwd?
=?value;
????????????}
????????}

????????
private?int?userAge;
????????
///?<summary>
????????
///?用戶年齡
????????
///?</summary>
????????[Column(DbType="int")]
????????
public?int?UserAge
????????{
????????????
get
????????????{
????????????????
return?userAge;
????????????}
????????????
set
????????????{
????????????????userAge?
=?value;
????????????}
????????}
????}

?

??? 好了,現在就可以看看在LINQ中如何完成CRUD的操作:

代碼 namespace?LinqUser
{
????
public?partial?class?LinqCRUD?:?Form
????{
????????//映射實體 ????????DataContext?objContext?=?null;

????????
public?LinqCRUD()
????????{
????????????InitializeComponent();
????????????
string?strConnection?=?"Server=localhost;uid=sa;pwd=123456;database=NunitUser;Integrated?Security=SSPI";
????????????objContext?
=?new?DataContext(strConnection);
????????}

????????
#region?數據CRUD
????????
///?<summary>
????????
///?數據插入
????????
///?</summary>
????????private?void?btnCreate_Click(object?sender,?EventArgs?e)
????????{
????????????
try
????????????{
????????????????
string?userName?=?this.tbUserName.Text.ToString();
????????????????
string?userPwd?=?this.tbUserPwd.Text.ToString();
????????????????
int?userAge?=?Convert.ToInt32(this.tbUserAge.Text.ToString());

????????????????User?user?
=?new?User();
????????????????user.UserName?
=?userName;
????????????????user.UserPwd?
=?userPwd;
????????????????user.UserAge?
=?userAge;
????????????????
????????????????
//插入
????????????????objContext.GetTable<User>().InsertOnSubmit(user);
????????????????
//提交
????????????????objContext.SubmitChanges();

????????????????MessageBox.Show(
"插入數據成功!",?"系統提示!");
????????????}
????????????
catch?(Exception?ex)
????????????{
????????????????MessageBox.Show(
"插入數據時錯誤:"?+?ex.Message,?"系統提示!");
????????????}
????????}

????????
///?<summary>
????????
///?數據修改
????????
///?</summary>
????????private?void?btnUpdate_Click(object?sender,?EventArgs?e)
????????{
????????????
try
????????????{
????????????????var?myUpdate?
=?from?user?in?objContext.GetTable<User>()
???????????????????????????????
where?user.UserID?==?1
???????????????????????????????select?user;
????????????????User?userUpdate?
=?myUpdate.First<User>()?as?User;
????????????????
if?(null?==?userUpdate)?return;
????????????????userUpdate.UserName?
=?this.tbUserName.Text.ToString();
????????????????userUpdate.UserPwd?
=?this.tbUserPwd.Text.ToString();
????????????????userUpdate.UserAge?
=?Convert.ToInt32(this.tbUserAge.Text.ToString());

????????????????
//提交
????????????????objContext.SubmitChanges();

????????????????MessageBox.Show(
"修改數據成功!",?"系統提示!");
????????????}
????????????
catch?(Exception?ex)
????????????{
????????????????MessageBox.Show(
"修改數據時錯誤:"?+?ex.Message,?"系統提示!");
????????????}
????????}

????????
///?<summary>
????????
///?數據刪除
????????
///?</summary>
????????private?void?btnDel_Click(object?sender,?EventArgs?e)
????????{
????????????
try
????????????{
????????????????var?myDel?
=?from?user?in?objContext.GetTable<User>()
????????????????????????????
where?user.UserID?==?1
????????????????????????????select?user;
????????????????User?userDel?
=?myDel.First<User>();
????????????????
if?(null?==?userDel)?return;

????????????????
//刪除
????????????????objContext.GetTable<User>().DeleteOnSubmit(userDel);

????????????????
//提交
????????????????objContext.SubmitChanges();

????????????????MessageBox.Show(
"刪除數據成功!",?"系統提示!");
????????????}
????????????
catch?(Exception?ex)
????????????{
????????????????MessageBox.Show(
"刪除數據時出錯:"?+?ex.Message,?"系統提示!");
????????????}
????????}

????????
///?<summary>
????????
///?數據查詢
????????
///?</summary>
????????private?void?btnRead_Click(object?sender,?EventArgs?e)
????????{
????????????
try
????????????{
????????????????var?myQuery?
=?from?user?in?objContext.GetTable<User>()
??????????????????????????????
where?user.UserID?==?1
??????????????????????????????select?user;

????????????????
if?(myQuery.Count<User>()?<=?0)?return;

????????????????
foreach?(User?user?in?myQuery)
????????????????{
????????????????????Console.WriteLine(
"用戶信息:UserID——>"?+?user.UserID?+?"、UserName——>"?+?user.UserName?+?"、UserPwd——>"?+?user.UserPwd?+?"、UserAge——>"?+?user.UserAge);
????????????????}

????????????????MessageBox.Show(
"查詢數據成功!",?"系統提示!");

????????????}
????????????
catch?(Exception?ex)
????????????{
????????????????MessageBox.Show(
"查詢數據時錯誤:"?+?ex.Message,?"系統提示!");
????????????}
????????}
????????
#endregion
????}
}

?

??? ? 到這里,LINQ的操作也結束了。運行感受一下吧。

????? 先說說我的感受吧,用NHibernate明顯感覺到效率沒有原生的SQL語句的好,可能只是插入一條語句,沒有批量的處理,Linq反而沒感覺到比NHibernate效率低。如果是對數據庫操作的實時性要求很高的話,可能不太適合使用ORM技術,當然了,才接觸到這些東西,也許有其它的解決辦法也說不定,待自己慢慢研究吧!!

轉載于:https://www.cnblogs.com/wangyong/archive/2010/06/02/1749993.html

總結

以上是生活随笔為你收集整理的NHibernateLinq简单的CRUD操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。