機房收費系統中的事務(二)

2021-06-05 13:40:27 字數 3315 閱讀 8308

在前一段時間,我寫過一篇在機房收費系統使用事務的一篇部落格,下面是鏈結位址

守巨集師兄(仔細看過之後,給出了自己的觀點,並且指出了**中的不足處。下面我將細細道來,希望對博友有些幫助,並希望大家提出寶貴意見!

首先要說的是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...

機房收費系統 登入 二

之前把登入窗體的的思路捋了一下,機房收費系統 登入 一 那會兒的思路還是不是很清晰,現在簡單的說一下,對於使用者的登入,級別對於使用系統中的功能有限制的作用 一般使用者 一級使用者,就是一般的操作使用者,可以用來上機和下機,對於個人賬戶的查詢等 操作員 二級使用者,可以管理一般使用者 管理員 使用者...