您回答的好用心ㄛ.
|
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 } } 希望你看的懂也希望對你有幫助!
|
|
|
這個方式,我還真的第一次看到耶,真是受教了 感謝大大費時為小弟解說 ^_^;
所以,假如今天我引用了第二個建構子 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
|
小桶子 您好: 沒錯,你~答~對~了~ ^_^ 互相切磋切磋
|
|
|
大大,這二天有小小研究一下這支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
|
|
|