用一句SQL取出第 m 條到第 n 條記錄的方法

2021-04-13 13:40:50 字數 4880 閱讀 5655

windows平台下程式日誌的設計和實現(上:設計、實現和應用)

問題:

在很多應用中,需要記錄程式執行過程中的關鍵資訊、關鍵操作、警告和異常等。這些資訊可以被用來追溯、除錯和排錯、分析執行時環境,或者用於其他特定的用途。一些長期執行的、無人監控的或者執行在後台不帶ui的程式,記錄執行時的日誌尤其重要。  

目標:

1、  實現日誌記錄功能。

2、  模組容易使用、容易擴充套件、可靈活配置。

3、  日誌內容分類輸出。  

約束:

windows平台 .net 架構  

方案:

1、  可以向檔案、資料庫和windows事件日誌中記錄日誌(開啟windows的「控制面板/管理工具/事件檢視器」,系統顯示windows事件日誌),並通過配置檔案靈活配置。

2、  可以容易地增加其他的日誌輸出源。

3、  寫入日誌源的同時,可以把控制「委託(delegate)」給外部入口。通常用這個辦法通知監控程式。例如,在寫日誌的同時,將日誌資訊「委託」輸出到使用者介面的乙個listbox中,管理員可以在listbox中適時看到日誌資訊。

4、  日誌分類輸出:debug < info < warn < error < fatal。小於預定級別的日誌不輸出。  

設計:

1、設計類圖: 

2、設計思路:

名稱 型別

功能描述

ilogger 

介面 日誌模組的介面,對外約定了操作日誌的公共方法。

cloggerabstract

抽象類

cloggerabstract 實現介面 ilogger。

在 cloggerabstract 中實現了日誌操作的通用方法,是日誌實現的框架。向具體輸出源寫入日誌的操作通過子類實現cloggerabstract的抽象函式來實現。

這是乙個典型的使用繼承的template模式(template模式的另外一種實現方法是使用聚合)。

cloggerabstract中包含乙個list,用以記錄所有向日誌登記的外部入口函式。一旦寫日誌的動作發生,cloggerabstract呼叫所有登記的入口函式,並把日誌資訊作為引數傳入。這是乙個觀察者模式。

cloggerfil

cloggerdatabase

cloggerevent

類 分別繼承自抽象類cloggerabstract,它們分別實現了向檔案、資料庫和windows事件日誌寫入日誌的具體操作。

上述三個類和cloggerabstract 類構成了模板模式。

clogge***ctory

類 提供靜態方法建立具體的日誌處理類(cloggerfile、cloggerdatabase、cloggerevent)。

這是乙個工廠模式。  

實現:

關鍵部分的實現。

1、  介面ilogger

public inte***ce ilogger

2、  模板方式的實現

在抽象類cloggerabstract中宣告了抽象方法:  

// 抽象函式,具體的寫日誌操作由子類實現

public abstract void _writelog(string message, string source, enumlevel type);  

cloggerabstract中寫日誌的**(以debug()為例): 

if( _outputlevel <= enumlevel.debug )// 實現日誌分級輸出write( message, source, enumlevel.debug );  

cloggerabstract的write()實際呼叫了抽象函式_writelog():  

private void write( string message, string source, enumlevel type )

catch( exception ex )

}  

抽象函式_writelog()的具體實現在各個子類中,因日誌輸出源的不同而有不同的版本。整個的運算邏輯在模板類中(這裡是抽象類cloggerabstract),具體類只是填充了模板類的空白。這樣做,達到了**復用的目的,並且使業務邏輯更加清晰。 

3、  管理外部處理入口函式

cloggerabstract中包含乙個list,用來儲存所有登記的外部處理入口函式:  

// 寫日誌時觸發外部方法的handle

private static arraylist _entrywritteneventhandler = new arraylist();  

當cloggerabstract寫入日誌的時候,依次呼叫_entrywritteneventhandler中登記的函式,並把當前寫入的日誌內容作為引數傳給這些函式:  

if( _entrywritteneventhandler.count >0 ) }

這樣一來,凡是在cloggerabstract中登記的函式都能夠適時得到寫入日誌的資訊。cloggerabstract提供了一組方法,用以登記和取消登記。

///

/// 設定寫日誌時觸發的外部方法

///

/// 外部方法handle

public void addentrywrittenhander( delegate handler )

catch( exception ex )

}  ///

/// 清除寫日誌時觸發的外部方法

///

public void clearentrywrittenhander()

catch( exception ex )

}  4、  clogge***ctory

clogge***ctory中定義了乙個靜態方法,用來根據配置檔案中的配置項建立不同的日誌處理類。

public static ilogger getlogger()

else if( logger.tolower().equals("database") ) // 資料庫日誌

else// if( logger.tolower().equals("event") ) // 預設使用系統日誌

}  應用:

1、  配置檔案

l         在配置檔案中修改logger.level的值,可以指定日誌的輸出級別。日誌級別:debug < info < warn < error < fatal。

l         在配置檔案中修改logger.name的值,則對應不同的logger.type可以有不同的含義。

1.       如果logger.type是database,則logger.name是向資料庫寫日誌的sql串,通常是一條帶引數的insert語句;

2.       如果logger.type是file,則logger.name是記錄日誌的檔名;

3.       如果logger.type是event,則logger.name是向windows寫入日誌的源名。  

2、  設定例子

日誌源為資料庫,日誌輸出級別為:debug,記錄日誌的資料庫表(oracle)已經建立。則配置檔案:

value="provider=oraoledb.oracle.1;password=zy;user id=zy;data source=mytest" />

…… >

loglevel) values(´´,´´,´´,´´); commit;end;" />  

日誌源為檔案,日誌輸出級別為:debug。

日誌源為系統,日誌輸出級別為:info。

3、  應用舉例:  

定義乙個logger

private static ilogger logger = clogge***ctory.getlogger();

在form上新增listbox,定義外部處理函式:

public void logentrywritten(object sender, mylogentrywrittenargs e) }

catch( exception ex ) }

將外部處理函式向logger登記:

logger.clearentrywrittenhander();

logger.addentrywrittenhander( new mylogentrywrittenhandler(this.logentrywritten) );

寫日誌:

_log.info( "啟動 schedule" ,this.tostring());

每當寫入日誌的時候,logentrywritten()會被呼叫。

擴充:

可以在以下方面對程式進行擴充:

1、  日誌內容的格式化輸出;

2、  增加多種日誌輸出源

3、  更強的執行時資訊輸出,如寫入日誌的類、函式、行號等資訊。

用一句SQL取出第 m 條到第 n 條記錄的方法

1 從table 表中取出第 m 條到第 n 條的記錄 not in 版本 23 select topn m 1 4 from table 5where id notin select topm 1 id from table 67 8 從table表中取出第m到n條記錄 exists版本 910 ...

SQL Oracle取出第m條到第n條記錄的方法

sql oracle取出第m條到第n條記錄的方法 用一句sql取出第 m 條到第 n 條記錄的方法 從table 表中取出第 m 條到第 n 條的記錄 not in 版本 select top n m 1 from table where id not in select top m 1 id fr...

SQL取出第 m 條到第 n 條記錄的方法

從table 表中取出第 m 條到第 n 條的記錄 not in 版本 select top n m 1 from table where id not in select top m 1 id from table 從table表中取出第m到n條記錄 exists版本 select top n m...