VC的另類資料庫程式設計(轉)

heying1229發表於2007-07-28
一、 製作VB資料庫訪問ACTIVEX DLL
  1、首先使用VB6.0建立一個心得ACTIVEX DLL工程,將工程命名為prjado、將類命名為clsado。

  2、為工程新增ADO物件庫的引用。工程->引用:Microsoft ActiveX Data Objects2.0 Library

  3、為類增加兩個新的變數:

Dim con As New ADODB.Connection 定義ADO會話連線物件
Dim cmd As New ADODB.Command 定義ADO命令物件

  4、增加初始化函式

Public Function ado_Init()
 con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=True;Data Source=sms.mdb"
 cmd.ActiveConnection = con
End Function

  建立到資料來源的物理連線

  指定Command物件當前所屬的 Connection 物件。

  5、資料庫操作函式

Public Function ado_add(ByVal strdata As String)
 cmd.CommandText = "insert into comdata (timm,datt) values (" + (Format(Date, "YYYY-MM-DD ")) + Str((Time)) + "," + (strdata) + ")"
 cmd.Execute
End Function

  將引數儲存到SMS.MDB的COMDATA表中

  注意:函式宣告時必須指定引數是傳值(ByVal),否則VB預設為按地址傳遞(ByRef)

  6、連線關閉函式

Public Function ado_UnInit()
 con.Close
 Set cmd = Nothing
 Set con = Nothing
End Function

  關閉連線並且釋放物件。

  儲存工程,編譯prjado.dll,這就是我們的服務元件,它完成了呼叫ADO物件實現對資料庫操作的功能。

  二、在VC程式中呼叫服務元件

  1、執行VC 6.0,使用MFC程式嚮導建立一個新的基於對話方塊的MFC應用程式。

  2、使用#import匯入服務元件,複製PRJADO.DLL到VC工程目錄,開啟STDAFX.H檔案增加如下程式碼:

# import "prjado.dll"
using namespace prjado;
這段程式碼應該放置在
file://{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately 之後和#endif 之前。

  在stdafx.h檔案匯入dll能夠讓編譯器在執行時連線dll的型別庫,#import它能夠自動產生一個對GUIDs的定義,同時自動生成對clsado物件的封裝。同時能夠列舉它在類中所能找到的型別, VC++會在編譯的時候自動生成兩個檔案:

  一個標頭檔案(.tlh),它包含了列舉的型別和對型別庫中物件的定義;

  一個實現檔案(.tli)對型別庫物件模型中的方法產生封裝。

  Namespace(名字空間)用來定義一個名字空間,使用unsing就可以將當前的型別上下文轉換名字空間所定地,讓我們可以訪問服務元件的方法。

  如果我們修改了服務元件程式,建議刪除這兩個檔案後重新完整編譯工程,以便讓編譯器重新列舉類的屬性以及函式。

  3、在對話方塊中新新增一按鈕,標題設為"測試"。雙擊"測試"按鈕,系統提示新建一函式OnButton1對應於該按鈕的CLICK事件。OnButton1函式的具體程式碼如下

HRESULT hresult;
CLSID clsid;
CoInitialize(NULL);
file://初始化COM介面
hresult=CLSIDFromProgID(OLESTR("prjado.clsado"), &clsid);
file://得到元件的CLSID
_clsado *t;
file://這就是我們在PRJADO.DLL中定義的類
hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_clsado),(LPVOID *) &t);
file://初始化CLSADO,CoCreateInstance()的第一個引數是物件的CLSID(類程式碼),這個128位的編碼唯一地標識了元件服務,它的路徑和執行引數等資訊都放在系統登錄檔中;第二個引數一般情況下設為NULL;第三個引數用來指明物件的執行環境,如遠端或本地,此處設為CLSCTX_INPROC_SERVER,標明是服務元件是一個DLL;第四個引數指明用來與物件通訊介面的ID,這也是一個128位的編碼;第五個引數是用來接收物件的介面指標。

if(FAILED(hresult))
{
AfxMessageBox("初始化服務元件失敗");
return;
}
file://如果初始化失敗,彈出提示對話方塊後退出程式

t->ado_Init() ;
file://呼叫初始化函式
t->ado_add("從VC呼叫元件") ;
file://呼叫增加記錄函式
t->ado_UnInit ();
file://呼叫關閉連線函式

t->Release();
file://釋放介面指標
CoUninitialize();
// 關閉COM庫的聯接
AfxMessageBox("呼叫服務元件完成");

  儲存工程後編譯執行VC 程式,點選"測試"按鈕,等待完成提示後,我們開啟資料庫就可以看到剛才新增的記錄了。

  結語:

  綜上所述,在實際的應用程式開發中,利用元件技術,我們可以進行VC和VB混合程式設計,充分地發揮開發的優勢,可以很好地加快軟體的開發進度,並且極大的改善程式的可維護性和可用性。


[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10172717/viewspace-928876/,如需轉載,請註明出處,否則將追究法律責任。

相關文章