Friday, December 28, 2007

openssl 版本的問題

最近工作的關係,需要作一個 ftps 的元件。後來找了很久,發現沒有開放原始碼的元件,但是有開放原始碼的程式-Filezilla。後來就套用 Filezilla 的 Source code 加以修改,做成了一個元件。不過測試時,呼叫第一次沒有問題,呼叫第二次時,就會產生 Access Violation 的錯誤。這個問題困擾了很久,但是一直無解。最近老闆又再問起進度,於是又將程式碼拿出來查看。後來在和 Filezilla 的設定做比較時,發現 Filezilla 是用 LoadLibrary 的方式使用 openssl,於是我就將原先 Additional Dependencies 中的 libeay32.lib 與 ssleay32.lib 移除。但是 compile 時卻出現無法連結到 BIO_test_flags 的問題。後來再檢查 Filezilla 所使用的 openssl 版本,結果發現我使用的 Filezilla 是使用 openssl-0.9.8d 的版本,於是再下載該版本來使用,結果還是有問題。後來發現 Filezilla 的目錄中有 openssl 的目錄,裡面是他所使用的 include 檔,於是將該目錄複製到我的工作目錄中,再於 Options 中的 include 使用目錄中新增該路徑後,可成功編譯。後來再作一次測試,發現之前的錯誤不會出現了,真是太神奇了。也又給了我ㄧ個教訓 - 版本真的很重要啊!

Thursday, December 20, 2007

由 Microsoft SQL Server 呼叫 Oracle Server

最近公司引進Oracle資料庫,因此有需求要從 Microsoft SQL Server 呼叫 Oracle Server。經過一番 Google 後,並且實際驗證可行。茲將步驟歸納如下:

1. 於 Oracle Server 上建立測試資料,包括

Table : EMP
Package : WRAPPACK (請參考這裡)

CREATE PACKAGE WrapPack
AS
TYPE EmpID IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
TYPE EmpName IS TABLE OF VARCHAR2(30)
INDEX BY BINARY_INTEGER;
PROCEDURE WrapPackSP
(
NameLike IN VARCHAR2,
EID OUT EmpID,
EName OUT EmpName
);
END WrapPack;
/
CREATE PACKAGE BODY WrapPack
AS
PROCEDURE WrapPackSP
(
NameLike IN VARCHAR2,
EID OUT EmpID,
EName OUT EmpName
)
IS
EmpCount NUMBER DEFAULT 1;
BEGIN
EID(EmpCount) := 1;
EName(EmpCount) := 'test';
END WrapPackSP;
END WrapPack;
/

2. 並於 MS SQL Server 的機器中安裝 Oracle Client 並設定 tnsnames.ora 的內容。

ORASVR =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = xxxx))
)
(CONNECT_DATA =
(SID = ORASVR)
(SERVER = DEDICATED)
)
)

3, 並於 MS SQL Server 建立連至 Oracle Server 的 Link Server(請參考這裡)。

EXEC sp_addlinkedserver 'OraLink', 'Oracle', 'MSDAORA', 'ORASVR'
EXEC sp_addlinkedsrvlogin 'OraLink', 'FALSE',NULL, 'userid', 'password'

4. 可於 MS SQL Server 上使用下列呼叫方式呼叫 Oracle 上的 Package。

declare @eid int
declare @ename varchar(30)
SELECT @eid=EID, @ename=ENAME FROM OPENQUERY( OraDBOSA , '{Call DOBOS.WrapPack.WrapPackSP( ''J%'', {resultset 20, eid, ename})}' )
select @eid, @ename

Tuesday, December 04, 2007

什麼是 Mock Objects?

MSDN(http://msdn.microsoft.com/msdnmag/issues/04/10/NMock/) 中的說明:Traditionally, unit testing terminology has included the concepts of drivers and stubs.傳統來說,Unit Testing 包含 drivers 及 stubs 兩個觀念。As an implementation of a driver, I use NUnit (currently at version 2.2), and for stubs I use NMock (currently at version 1.1) to create dynamic mock objects at run time.如果要實作 driver 會使用 NUnit,如果是實作 stubs 的話,則使用 NMock 來即時動態產生 mock 物件。It is worth noting that NMock uses reflection to create mock implementations of interfaces at run time, so to use NMock it is necessary to code against interfaces instead of implementations.值得注意的是 NMock 使用 reflection 來即時依照 interfaces 產生實作的 mock,所以在使用 NMock 時,必須依照 interfaces 而非 implementations 來寫程式。(註:Reflection(或稱為RTTI)已成為主流語言中必備的特色,其主要用途在於執行時期提供型別資訊)