在前一段時間,我寫過一篇在機房收費系統使用事務的一篇部落格,下面是鏈結位址
守巨集師兄(仔細看過之後,給出了自己的觀點,並且指出了**中的不足處。下面我將細細道來,希望對博友有些幫助,並希望大家提出寶貴意見!
首先要說的是sqlhelper這個資料庫助手類,在我的原文中,處理事務的方法是和執行非查詢語句一起執行的。其實可以感覺到,這裡就有了**的「壞味道」,我們都知道職責單一原則。職責單一原則是對類而言的,而類又是由方法組成的,那麼乙個方法當然也應該做到職責單一。而在第一篇博文中的sqlhelper類裡的executenonquery其實就擁有兩個功能,乙個是執行含有事務的sql;另乙個是執行不含事務的sql。這個判斷是放在了sqlhelper類裡,其實乙個比較好的處理方法是把這個方法分成兩個方法,乙個是執行含有事務的sql語句或儲存過程,乙個是執行不含有事務的sql語句或儲存過程。
那麼判斷要怎麼處理呢?
最好是放在d層去處理。
下面是乙個方法清晰,功能完善的資料庫助手類sqlhelper
using system;
using system.collections.generic;
using system.data;
using system.data.sqlclient;
using system.collections;
using system.configuration;
namespace sqlhelp
/// /// 執行sql語句(事務中)
///
/// 在事務中執行的某個sql語句或者儲存過程
/// 引數
/// 型別
/// 連線
/// 事務
/// 返回受影響的行數
public int execnoselect(string cmdtext, sqlparameter paras, commandtype cmdtype, sqlconnection sqlconn, sqltransaction sqltran)
/// /// 關閉資料庫連線
///
private void close()
/// /// 連線資料庫的私有方法
///
///
private sqlconnection getcon()
return sqlcon;
}/// /// 處理傳過來的sql語句或者儲存過程
///
/// sql語句或者儲存過程
/// 型別
/// 返回查詢的到的databable
public datatable executequery(string cmdtext, commandtype ct)
close();
return dt;
}/// /// 處理傳遞進來的帶引數的sql語句或是儲存過程,返回datatable
///
/// 帶引數的sql語句或是儲存過程
/// sql引數
/// 型別
/// 返回查詢的到的datatable
public datatable executequery(string cmdtext, sqlparameter paras, commandtype ct)
close();
return dt;
}/// /// 執行傳遞進來的sql語句或是儲存過程
///
/// sql語句或是儲存過程
/// 型別
/// 返回受影響的行數
public int executenonquery(string cmdtext, commandtype ct)
return res;
}/// /// 執行傳遞進來的帶引數的sql語句或是儲存過程
///
/// sql字串
/// 引數
/// sql字串的型別
/// 返回受影響的行數
public int executenonquery(string cmdtext, sqlparameter paras, commandtype ct)
return res;
}/// /// 批量插入資料
///
/// 資料表名稱
/// 要插入的資料
///
public bool batchinsertdata(string tablename, datatable dt)
//匯入
sqlbulk.writetoserver(dt);
sqlbulk.close();
return true;}}
}
下面是師兄的意見:
那就是利用物件導向中的「抽象」,再抽象出乙個事務管理類,用來管理b層的事務。這樣就更加物件導向了。
下面是事務管理類
using system.data;
using system.data.sqlclient;
using system.configuration;
using system.collections;
using entity;
namespace dal
/// /// 開啟事務
///
public sqltransaction tranbegin()
/// /// 提交事務
///
public void trancommit()
/// /// 回滾事務
///
public void tranrollback()
/// /// 關閉連線
///
public void close()
}}
通過和師兄討論,我們認為兩種方法都可以。第一種方法處理更加簡單、方便,第二種方法更能體現物件導向的觀點。
希望大家提出寶貴意見!!!
機房收費系統中的事務(二)
在前一段時間,我寫過一篇在機房收費系統使用事務的一篇部落格,下面是鏈結位址 守巨集師兄 仔細看過之後,給出了自己的觀點,並且指出了 中的不足處。下面我將細細道來,希望對博友有些幫助,並希望大家提出寶貴意見!首先要說的是sqlhelper這個資料庫助手類,在我的原文中,處理事務的方法是和執行非查詢語句...
機房收費系統(二)
目錄 機房收費系統敲了一部分,發現了很多之前沒有注意的地方,以前也是態度不夠嚴謹吧 也收穫了一些技巧和經驗。拿來給大家分享一下 發現的問題 sql server 轉換varchar值 6000000001 時溢位整數列。超過了其最大整數值。解決方法 將int型別,轉換為bigint 或 numeri...
機房收費系統 登入 二
之前把登入窗體的的思路捋了一下,機房收費系統 登入 一 那會兒的思路還是不是很清晰,現在簡單的說一下,對於使用者的登入,級別對於使用系統中的功能有限制的作用 一般使用者 一級使用者,就是一般的操作使用者,可以用來上機和下機,對於個人賬戶的查詢等 操作員 二級使用者,可以管理一般使用者 管理員 使用者...