[UDF系列]如何編寫InterBase UDF 之二

(接上一篇)

如何編寫InterBase UDF<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

warton

怎麼編寫字符串和日期型處理函數的UDF呢?

 

下面編寫一個“Left“函數

    內存分配問題:

              如果你使用IB(InterBase)5.1以下版本的話,在你的單元文件中鍵入下面的聲明:

function malloc(Bytes: Integer): Pointer; cdecl; external 'msvcrt.dll';

       如果你有5.5以上的版本,你就不需要這麼做了。這樣,先確定ib_util.pas 文件在你的編譯器可以找到的路徑中,並且ib_util.dll也在你的搜索路徑之中。

最簡單的方法是放到的庫可搜索到的路徑。

                            c:/Program Files/InterBase Corp/InterBase/include

然後複製

              c:/Program Files/InterBase Corp/InterBase/lib/ib_util.dll

        到你的windows系統目錄下(典型的是:c:/Windows/System)。最後在你的單元文件的use子句中將ib_util.pas加進去

               ...,

ib_util;

爲什麼有如此奇特的內存分配?爲什麼我不能用AllocMem分配內存,或者其它方法?問題很簡單:你不能,所以不要問!更復雜的問題是每一個編譯器使用它喜歡的算法來進行內存管理,這是被操作系統控制着的。例如,VC和Delphi管理內存的方式不同,猜這是爲什麼?IB是在VC下編譯的,在5.5以前的版本中,你必須直接指定運行庫。在IB5.5之後,IB給了一個IB調用使得這成爲可能。既然這樣,那我們繼續進行編寫字符串操作的函數。

 

構建函數

       在新的單元文件中,作如下聲明:

function Left(sz: PChar; Cnt: Integer): PChar; cdecl; export;

    在函數實現部分:

 

在你的工程文件中,在“exports“部分鍵入:

 

Now,再次編譯工程項目….

現在,爲了使用函數,在ISQL中重新連接數據庫,輸入:

               cstring(64), integer

               returns cstring(64) free_it

entry_point 'Left' module_name 'dll name minus ".dll"';

測試這個函...

select f_Left('Hello', 3) from rdb$database

 

仍然相當簡單,哈?

 

上我們來編寫一個時間函數

 

       IB6中,有三種不同的時期類型被支持,DATE,TIME,TIMESTAMP,與IB5.5及以前老版本中的相比,TIMESTAMP 的數據類型實質上相當於IB5.5DATE類型。

       爲了在你的程序中”decode””encode”這些類型。你應該瞭解一點IB API相關的信息。輸入以下代碼:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

現在我們寫日期UDF:

       在單元文件的interface部分,輸入聲明:

implementation(實現)部分,輸入:

 

最好,在你的工程文件中:在““部分,輸入:

exports

Modulo,

Left,

Year,

Hour;

現在編譯工程...

 

爲了使用這個函數,就像上面那樣:用ISQL連接數據庫,輸入:

 

最後再測試一下看!

select f_Year(cast('7/11/00' as date)) from rdb$database

這一部分並非像前面字符串和整數那樣操作哪樣了,但是還是相當...simple,哼!

編寫Linux/Unix平臺的UDF

(未完待續!!)

發佈了35 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章