(接上一篇)
如何編寫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.5的DATE類型。
爲了在你的程序中”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
(未完待續!!)