台灣最大的程式設計社群網站
線上人數
883
 
會員總數:356096
討論主題:191571
免費程式:2733
歡迎您免費加入會員
首頁 >> 程式下載 >> 程式資料檢視
程式資料
名稱 資料庫存取控制(Oracle,SQL,OLEDB,ODBC) For .NET2005
類別 各種元件 使用者介面 元件
程式語言 C# 開發狀態 100% - 成熟
語系 繁體中文 難易度 難度五(適合高階程式能力使用者)
原創者 SuperBin  原創者網址  
提供者 SuperBin 捐贈 VP 給 SuperBin 執行網址  
版權 開放源碼 評分
(共有 6 人投票,總分 26)
我要評分 : 不好<- 1 2 3 4 5 -> 很好   這個程式不能有問題歐! 加入我的收藏夾!
說明
資料庫存取控制(Oracle,SQL,OLEDB,ODBC) For .NET2005
1.新增由 ConnectionString 自動判動 DB_TYPE [2008/04/12]
2.新增 DataAccessService 建構子可傳入是否加入 DataAccessPool 的引數,代表可由使用者決定是否要將 DataAccessService 加入 DataAccessPool 中,而預設值為 True [2008/04/12]
3.希望大家使用後給意見,我會一直根據需求更新,只要一直有人用的話
預覽畫面
目前尚無任何預覽畫面
檔案列表
檔名 : DataAccess_20080412.rar  下載數:184
檔案大小:423970 Bytes  上傳時間:2008-04-12 10:55
下載此檔案
--
網友回應  
如要發送訊息請先登入.
您回答的好用心ㄛ. kurt [2008-04-10 13:17]
大大您好,我可以在問幾個問題嗎?
1.若再Web from理.應該在哪宣告new DataAccessService會比較好.我看您的範例是宣告在主程式外部,若再網頁程式應該宣告在哪會比較好ㄋ.
2.像我公司有500多User, 若User進入系統操作資料庫功能,是不是會建立500多個Connectionㄋ.
3.DataAccessPool是不是會把當時的Connection存下來,等下次使用.這樣會不會讓MS SQL Server效能降低ㄋ.

又要勞煩您,不好意思.
回應 : 您回答的好用心ㄛ. [2008-04-12 10:38] SuperBin
[上一個問題]

觀念我有不太懂,這形我了解.
_DataAccessService1 = new DataAccessService ( Services.Lib.DataAccessService.Enum.DB_TYPE.OLEDB , "DataAccess1" , _ConnectString );
//我有改成.OLEDB

下面程序我就不太懂了
if ( !_DataAccessService1.Connection ( ) ) {
//它會去呼叫class OleDbDataProvider的Connection()

public override bool Connection() {
01 bool ReValue = false;
02 try {
03 if(_OleDbConnection != null) {
04 _OleDbConnection.Close();
05 _OleDbConnection.Dispose();
06 _OleDbConnection = null;
07 }
08 _OleDbConnection = new OleDbConnection(_ConnectionString);
09 if(_OleDbConnection != null) {
10 _IsConnection = true;
11 _IsOpen = false;
12 }
13 } catch(Exception ex) {
14 _IsConnection = false;
15 _IsOpen = false;
16 System.Diagnostics.Debug.WriteLine(ex.Message);
17 throw ex;
18 }
19 ReValue = _IsConnection;
20 return ReValue;
}
//若第一次New時_OleDbConnection是null,所以他會執行08行.
//之後會去執行 if ( !_DataAccessService1.Open ( ) ) ,Open _OleDbConnection
//若第二個網頁去Run時, 03行不是會成立嗎? 把之前的Connection Close掉 , 重新 new一個.
//or 我的想法不正確 or DataAccessService適合AP不適合網頁使用ㄋ.

*****************************************************************************************************************************************************

kurt 您好:
SOORY ! 我本來要刪我的回應但我按錯了!!

1.回答上一個問題與本問題的 1.若再Web from理.應該在哪宣告new DataAccessService會比較好.我看您的範例是宣告在主程式外部,若再網頁程式應該宣告在哪會比較好ㄋ.
Ans:
你提的這個問題應該是要看你如何使用它,如果照你所說的應該代表你第一個與第二個網頁都有去 new DataAccessService 與 _DataAccessService1.Connection ( ) 、
_DataAccessService1.Open ( ) 這些動作,那當然會產生你上一個問題中所說的現象,但是如果在網頁中,我建議你是將 DataAccessService 放在 Session 中而且是只
new DataAccessService 一次,也只呼叫 _DataAccessService1.Connection ( ) 、 _DataAccessService1.Open ( ) 一次,那就OK了,還有你可以使用
_DataAccessService1.IsConnection 與 _DataAccessService1.IsOpen 來判定是否已經 Connection 或 Open 。

2.回答 2.像我公司有500多User, 若User進入系統操作資料庫功能,是不是會建立500多個Connectionㄋ. 與 3.DataAccessPool是不是會把當時的Connection存下來,等下次使用.這樣會不會讓MS SQL Server效能降低ㄋ.
Ans:
我上次跟你說的 User 是 Oracle 中的 User 跟你說的有點不太一樣喔!而依據你所提的問題我覺得你所說的是網站 Client 端的 User ,如果是的話,當在"同一個時間點"
有500多的 Client User 同時上線且連上資料庫,那當然一定會有 500 多個 Connection 出現阿,因為每個 Client 端 User 是不同的點位阿,而如果你是像我所說的一樣
將 DataAccessService 或 DataAccessPool 放在 Session 中時,那當一個 Session 結束時,其中的 DataAccessService 或 DataAccessPool 就會跟著結束,也就是說 Connection
也會跟著結束,並不會一直存在,所以你所使用的 MS SQL Server 也不會降低,而且一個網站的效能要好且快不只是程式要寫的好喔!硬體與網路品質也佔粉大因數喔!

3.我有將 DataAccessService 再做了一個修改:
(1)新增 DataAccessService 建構子可傳入是否加入 DataAccessPool 的引數,代表可由使用者決定是否要將 DataAccessService 加入 DataAccessPool 中,而預設值為 True
(2)新增由 ConnectionString 自動判動 DB_TYPE

希望我的回答你看的懂且有幫助,也感謝你跟我的互動,我們互相切磋切磋,這樣這個元件將會更好喔!!

您可以稱為新世代的偉人,小弟不了解一個地方,不知可否開釋一下. kurt [2008-04-09 15:29]
DataAccessService建構式中的下列Code的意義在哪?
int aPos = -1;
if ( ( aPos = DataAccessPool.Instance.IndexOf ( this ) ) == -1 ) {
DataAccessPool.Instance.Add ( this );
} else {
if ( DataAccessPool.Instance.SameNameIsReplace ) {
DataAccessPool.Instance[aPos] = this;
} else {
throw new Exception ( "DataAccessService 有重複 Name : " + this.Name );
}
}

我不太能了解,不知能否教我一下,感激您!.
若我能懂的話,後續的應該可以再看下去.
回應 : 您可以稱為新世代的偉人,小弟不了解一個地方,不知可否開釋一下. [2008-04-09 18:04] SuperBin

kurt 您好:
關於您所提的問題,讓我為您回答一下,當初在寫這個元件時,希望可以達到一個目標:
因為我所使用的資料庫是 Oracle ,而每個 User 都有不同的權限與所擁有的表格,但我希望在專案中可以有多個 Connection ,也就是每個 User 一個 Connection,
所以我想把這些 Connection 放在一個 Pool 中,那想要使用它的人就可以直接取出來用,不用再重新寫程式碼,所以當你 new 出一個 DataAccessService 時就會將它放入 Pool 中,
那當想要使用的時候就不用在 new 了,這樣就可以統一管理了,當然你的專案如果只有一個 DataAccessService 時,就看不出它的用意與好處;而我所說得 Pool 物件就是 DataAccessPool,
我上傳的範例中就有稍微使用了一下,你可以看一下喔!接下來再跟你說明一下這段程式碼:

int aPos = -1;
if ( ( aPos = DataAccessPool.Instance.IndexOf ( this ) ) == -1 ) {//(1)先看看本次被 new 得 DataAccessService 是否已經存在於 DataAccessPool 中,不存在就進入(2),已經存在就進入(3)
DataAccessPool.Instance.Add ( this );//(2) 當不存在於 DataAccessPool 中時就將本次被 new 得 DataAccessService 加入於 DataAccessPool 中
} else {
if ( DataAccessPool.Instance.SameNameIsReplace ) {//(3)這是一個屬性設定,當 DataAccessPool.Instance.SameNameIsReplace 被設定為 True 時,代表如果有相同的名稱存在時就用本次所 new 得 DataAccessService 去覆蓋,進入(4);如果設定為 False 時,代表不可以覆蓋,進入(5)
DataAccessPool.Instance[aPos] = this;//(4)用本次所 new 得 DataAccessService 去覆蓋
} else {
throw new Exception ( "DataAccessService 有重複 Name : " + this.Name );//(5)丟出 Exception
}
}
希望你看的懂也希望對你有幫助!

受教了^_^ 小桶子.Net新手 [2008-04-09 00:06]
這個方式,我還真的第一次看到耶,真是受教了 感謝大大費時為小弟解說 ^_^;

所以,假如今天我引用了第二個建構子
public SqlDataProvider(string oConnectionString):this("",oConnectionString) {}
其實他會先將參數傳給第三個建構子
public SqlDataProvider(string oName,string oConnectionString):this(oName,new SqlConnectionStringBuilder(oConnectionString)) {
}
然後this(oName,new SqlConnectionStringBuilder(oConnectionString) 第二個參數,將會new 成一個 SqlConnectionStringBuilder 再傳給第四個,不知道這樣說對不對呢?
回應 : 受教了^_^ [2008-04-09 10:48] SuperBin
小桶子 您好:
沒錯,你~答~對~了~ ^_^ 互相切磋切磋

請教大大 小桶子.Net新手 [2008-04-08 18:23]
大大,這二天有小小研究一下這支Project
其中有一段寫到:
public SqlDataProvider(SqlConnectionStringBuilder oSqlConnectionStringBuilder): this("",oSqlConnectionStringBuilder) {}

想請問一下大大,為什麼this後面可以接二個引數? 這個意思是指什麼呢?

另外,如果想要增加DBLog,以大大的結構來看,是不是需要在Abstract裡在定義一個Abstract Log ,再有每個繼承的類別實作呢??

回應 : 請教大大 [2008-04-08 23:00] SuperBin
小桶子 您好:
依據您所提的問題給你作一個回答,互相切磋切磋

1.為什麼this後面可以接二個引數? 這個意思是指什麼呢?

Ans:
之所以可以使用 this 後面再接兩個引數,最主要是因為它是這個類別得建構子才可以這樣寫,我把這個類別的建構子都拿出來讓你看一下,如下所敘,我總共寫了四個建構子,
我就依據我的架構來說明一下,我最主要是希望讓使用的人可以在 new 這個類別時可以傳入下列四種引數的組合,但是你注意看,其實這四個建構子最主要的是第四個,
因為前三個都利用他們都是建構子且可以使用這種寫法的特性,全都將引數指向第四個建構子的引數,這樣一來我就不用在前面三個中還要寫相同的程式碼,我就拿第一個來說明一下

第一個建構子:傳入的引數為一個,且為 SqlConnectionStringBuilder 的物件,然後你注意看第四個建構子,他則是需要傳入兩個,且分別是 string、SqlConnectionStringBuilder ,
但是第一個建構子則只有傳入一個,所以為了達到第四個建構子得條件,我必須傳入兩個引數,第一個引數我使用空字串,第二個則使用第一個建構子的引數 oSqlConnectionStringBuilder
,這樣一來我就不用在第一個建構子中寫任何程式碼,如果你有DEBUG一下,你會發現它會先進入第一個建構子然後馬上進入第四個建構子,這樣的寫法是我所規劃的架構,
因為這樣可以達到我想要的結果(我粉懶啦!!哈!哈!不想相同的程式碼寫粉多次,維護也較方便),當然也可以不這樣寫阿,希望你看的懂我的說明。

public SqlDataProvider(SqlConnectionStringBuilder oSqlConnectionStringBuilder): this("",oSqlConnectionStringBuilder) {
}

public SqlDataProvider(string oConnectionString):this("",oConnectionString) {
}

public SqlDataProvider(string oName,string oConnectionString):this(oName,new SqlConnectionStringBuilder(oConnectionString)) {
}

public SqlDataProvider(string oName,SqlConnectionStringBuilder oSqlConnectionStringBuilder) {
_Name = oName;
_ConnectionString = oSqlConnectionStringBuilder.ConnectionString;
}

**** 以下為如果沒有使用這樣的寫法則會變成下面這樣 ****

public SqlDataProvider(SqlConnectionStringBuilder oSqlConnectionStringBuilder) {
_Name = ""
_ConnectionString = oSqlConnectionStringBuilder.ConnectionString;
}

public SqlDataProvider(string oConnectionString):this("",oConnectionString) {
_Name = "";
_ConnectionString = oConnectionString;
}

public SqlDataProvider(string oName,string oConnectionString):this(oName,new SqlConnectionStringBuilder(oConnectionString)) {
_Name = oName;
_ConnectionString = oConnectionString;
}

public SqlDataProvider(string oName,SqlConnectionStringBuilder oSqlConnectionStringBuilder) {
_Name = oName;
_ConnectionString = oSqlConnectionStringBuilder.ConnectionString;
}

2.如果想要增加DBLog,以大大的結構來看,是不是需要在Abstract裡在定義一個Abstract Log ,再由每個繼承的類別實作呢??

Ans:
嗯嗯!當然可以依據您所說的規劃來寫阿!

請問如何使用 pp [2008-04-08 09:41]
SuperBin 你好:
我有download你的專案下來了,可是我不知道要怎麼用,請問是否有範例或是使用說明文件可以參考。謝謝!!
回應 : 請問如何使用 [2008-04-08 13:08] SuperBin
hi pp 你好:
我已經又再重新上傳,本次新增加MS Access 2003 的資料庫,我怕有人沒有裝MS SQL 2000,所有把它加了上去,希望對你有幫助
1.本範例是使用MS-SQL 2000 中的 Northwind與Pubs 與 從MS-SQL 2000 中的 Northwind與Pubs 匯出成MS Access 2003 得MDB來作範例說明,如果你有裝SQL Server 2000 就可以直接使用,
如果你沒有裝請使用裡面所提供得MS Access 2003 得MDB檔來執行,當然你也可以使用其他資料庫,例如:Oracle,Access
2.我先寫幾各查詢的範例,看是否足夠讓大家了解,如果不夠請再反映給我,我再增加
3.你是不是也常為不同資料庫得 ConnectString 寫法不同而困擾呢?或忘了怎麼寫呢?這裡提供一個不錯的網址給你做參考,裡面有各種資料庫型態得 ConnectString ,網址如下:
http://www.carlprothman.net/Technology/ConnectionStrings/NETDataProviders/tabid/86/Default.aspx
回應 : 請問如何使用 [2008-04-08 12:10] SuperBin
hi pp 你好:
我已經在重新上傳,裡面有簡單使用範例
1.本範例是使用MS-SQL 2000 中的 Northwind與Pubs 來作說明,只要你有裝SQL Server 2000 就可以使用,當然你也可以使用其他資料庫,例如:Oracle,Access
2.我先寫幾各查詢的範例,看是否足夠讓大家了解,如果不夠請再反映給我,我再增加
3.你是不是也常為不同資料庫得 ConnectString 寫法不同而困擾呢?或忘了怎麼寫呢?這裡提供一個不錯的網址給你做參考,裡面有各種資料庫型態得 ConnectString ,網址如下:
http://www.carlprothman.net/Technology/ConnectionStrings/NETDataProviders/tabid/86/Default.aspx