當前位置:編程學習大全網 - 編程語言 - 數據庫編程為什麽要設置數據源?

數據庫編程為什麽要設置數據源?

VC中動態加載ODBC的方法

使用VC、VB、Delphi等高級語言編寫數據庫應用程序時,用戶往往需要在控制面板中配置ODBC數據源。對於普通用戶來說,配置ODBC數據源可能是壹項艱巨的任務。而且在實際應用中,用戶往往要求在同壹個應用中訪問不同的數據源,所以壹般的加載方式存在不可克服的缺陷。為了在程序中完成這項工作,方便應用程序的使用,本文介紹了以VC為開發環境,在應用程序中動態加載ODBC系統數據源的兩種方法。

方法1:修改註冊表。

設計理念

壹般來說,當用戶在控制面板中配置ODBC數據源時,Windows系統會在註冊表中添加壹些子項來存儲用戶的配置結果。當應用程序需要數據源時,Windows會通知底層接口查詢註冊表中數據源的配置。如果用戶刪除了壹個ODBC數據源,它也會反映在註冊表中。如果配置的數據源是用戶數據源,Windows將修改註冊表的HKEY _當前_用戶\軟件\ odbc \ odbc.ini子項。如果配置的數據源是系統數據源,Windows系統將修改註冊表的HKEY _本地_機器\軟件\ odbc \ odbc.ini主鍵。因此,我們可以在應用程序中使用Windows API中的註冊表編輯功能來完成Windows所做的工作,從而達到動態加載數據源的目的。

具體實現

對於不同類型的數據源,註冊表的修改也不同,但基本上有兩個地方可以修改。壹種是在子項ODBC下創建壹個與數據源描述名同名的子項。INI,並在該子項下創建與數據源配置相關的項;另壹種方法是在子項\ODBC下創建壹個新項目。INI\ODBC數據源告訴驅動程序管理器ODBC數據源的類型。下面以配置Microsoft Access數據源為例,給出實現該功能的函數代碼。

/* strSourceName是要創建的數據源的名稱,strSourceDb是數據庫存儲路徑,strDescription是數據源的描述字符串。* /

BOOL CLoadOdbcDlg::LoadDbSource(c string strsource name,CString strSourceDb,CString strDescription)

{

//存儲打開的註冊表項

HKEY hKey;

DWORD dw

//存儲註冊表API函數執行的返回值。

LONG lReturn

//存儲要打開的子項。

CString strSubKey

//檢查是否安裝了MS Access ODBC驅動程序:odbcjt32.dll。

//獲取Windows系統目錄

char sysDir[MAX _ PATH];

char drv name[]= " \ \ odbcjt 32 . dll ";

* get system directory(sysDir,MAX _ PATH);

strcat(sysDir,drvName);

CFileFind findFile

如果(!查找文件。FindFile (sysDir))

{

AfxMessageBox ("odbcjt32.dll,MS Access的ODBC驅動程序,沒有安裝在您的計算機系統中,因此您將無法加載這種數據源。",MB _ OK | MB _ ICONSTOP);

返回false

}

str subkey = " SOFTWARE \ \ ODBC \ \ ODBC。INI \ \ "+strSourceName;

//在註冊表中創建ODBC數據源的子項。

lReturn =::RegCreateKeyEx(HKEY _本地_

MACHINE,(LPCTSTR)strSubKey,0,NULL,REG_OPTION

_NON_VOLATILE,KEY_WRITE,NULL,& hKey,& dw);

if(lReturn!=錯誤_成功)

返回false

//設置數據源的各種參數。

CString strDbq = strSourceDb

CString strDriver = sysDir

DWORD dwDriverId = 25

CString strFil = " MS Access

CString strPwd = strSourceName

DWORD dwSafeTransactions = 0;

CString strUid = strSourceName

* RegSetValueEx(hKey,“DBQ”,0L,REG_SZ,

(CONST BYTE* )((LPCTSTR) strDbq),strDbq。GetLength());* RegSetValueEx(hKey," Description ",0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strDescription),str Description。GetLength());

* RegSetValueEx(hKey," Driver ",0L,REG_SZ,(CONST BYTE* )((LPCTSTR)strDriver),strDriver。GetLength());

* RegSetValueEx(hKey," DriverId ",0L,REG_DWORD,(CONST BYTE* )(& dwDriverId),sizeof(dw));

* RegSetValueEx(hKey," FIL ",0L,REG_SZ,

(CONST BYTE* )((LPCTSTR) strFil),strFil。GetLength());

* RegSetValueEx(hKey,“PWD”,0L,REG_SZ,

(CONST BYTE* )((LPCTSTR)strPwd),strPwd。GetLength());* RegSetValueEx(hKey,"安全交易",0L,

REG_DWORD,(CONST BYTE *)(& dw safe transactions),sizeof(dw));

* RegSetValueEx(hKey," UID ",0L,REG_SZ,

(CONST BYTE* )((LPCTSTR)strUid),strUid。GetLength());* RegCloseKey(hKey);

//創建ODBC數據源的Jet子項。

str subkey+= " \ \ Engines \ \ Jet ";

lReturn =::RegCreateKeyEx(HKEY _ LOCAL _ MACHINE,(LPCTSTR)strSubKey,0,NULL,REG_OPTION_NON_

VOLATILE,KEY_WRITE,NULL,& hKey,& dw);

if(lReturn!=錯誤_成功)

返回false

//設置該子項下的參數。

CString strImplict =

CString strUserCommit = " Yes

DWORD dwpage time out = 5;

DWORD dw threads = 3;

DWORD dwMaxBufferSize = 2048

* RegSetValueEx(hKey," ImplictCommitSync ",0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strImplict),strImplict。GetLength()+1);

* RegSetValueEx(hKey," MaxBufferSize ",0L,REG_DWORD,(CONST BYTE* )(& dwMaxBufferSize),sizeof(dw));

* RegSetValueEx(hKey," PageTimeout ",0L,REG_DWORD,(CONST BYTE* )(& dwPageTimeout),sizeof(dw));

* RegSetValueEx(hKey," Threads ",0L,REG_DWORD,(CONST BYTE* )(& dwThreads),sizeof(dw));

* RegSetValueEx(hKey," UserCommitSync ",0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strUserCommit),struser commit。GetLength());

* RegCloseKey(hKey);

//設置ODBC數據庫引擎名稱

lReturn =::RegOpenKeyEx(HKEY _ LOCAL _ MACHINE," SOFTWARE\\ODBC\\ODBC。INI\\ODBC數據源”,0L,KEY_WRITE,& hKey);

if(lReturn!=錯誤_成功)

返回false

c string strDbType = " Microsoft Access驅動程序(*。MDB)”;* RegSetValueEx(hKey,strSourceName,0L,REG_SZ,(CONST BYTE* )((LCTSTR)strDbType),strDbType。GetLength());

返回true

}

因為在動態加載中,壹般只改變數據庫文件、數據源描述和數據源描述,所以上述功能可以滿足應用中的大部分需求。如果應用中需要更多的改變,也可以通過改變功能參數來實現。對於動態加載多種類型數據源的情況,可以使用不同參數的重載函數來實現。

方法2:使用DLL

設計理念

Windows系統子目錄下的動態鏈接庫Odbcinst.dll提供了壹個函數SQLConfigDataSource(),可以動態添加、修改、刪除數據源。該函數的原型如下:

BOOL SQLConfigDataSource(HWND HWND parent,WORD fRequest,LPCSTR lpszDriver,LPCSTR lpszAttributes);

hwndParent參數是父窗口句柄。如果該值為NULL,則不會顯示與父窗口相關的對話框。

fRequest參數可以設置為下列值之壹:

ODBC_ADD_DSN:添加新的用戶數據源;

ODBC_CONFIG_DSN:修改(配置)現有的用戶數據源;

ODBC_REMOVE_DSN:刪除現有的用戶數據源;

ODBC_ADD_SYS_DSN:添加新的系統數據源;

ODBC_CONFIG_SYS_DSN:修改(配置)現有的系統數據源;

ODBC_REMOVE_SYS_DSN:刪除現有系統數據源。

lpszDriver參數用於傳遞數據庫引擎的名稱,它相當於方法1中的strDbType變量。

lpszAttirbutes參數是關鍵字的值,即壹系列“keyname=value”字符串,每兩個字符串之間用“\”隔開,如DSN = personnel data \ 0 uid = Smith \ 0 database = personnel。關於該參數的詳細設置,請參考MSDN中SQLConfigDataSource()函數的幫助文檔以及各種ODBC驅動文檔。

具體實現

由於VC默認的庫文件不包含SQLConfigDataSource()函數,所以在使用該函數之前,需要在項目的頭文件中包含odbcinst.h文件,在項目的設置屬性對話框的鏈接屬性頁的對象/庫模塊的編輯框中添加odbc32.lib,並確保系統目錄system32下有文件odbccp32.dll。

還是以Microsoft Access為例,將數據源設置為demo,將數據源設置為“示例數據源”,然後在需要動態加載數據源的地方添加以下代碼:

* sqlconfigdatasource(null,odbc _ add _ sys _ DSN," Microsoft Access驅動程序(*。MDB)”,“DSN = demo \ 0 description = sample database”);

總結

以上兩種方法都可以動態加載各種類型的ODBC數據源,並在Windows95/98/NT/2000環境下進行了調試。第壹種方法實現時需要更多的代碼,第二種方法需要的代碼較少,但需要額外文件的支持。而且隨著數據源配置靈活性的增加,為了形成lpszAttributes字符串,代碼長度也會相應增加。因為從控制面板配置數據源可以讓程序員有更直觀的了解,程序員不僅可以查閱相關驅動的文檔,還可以在編程前通過控制面板配置ODBC數據源,然後根據註冊表中相應部分的內容進行編程。

======================================

動態創建Access數據源名稱

本文由馬達瓦v。

本文中的這個示例是使用VC 5.0創建的。必要的。h和。lib文件存在於zip中。

要在運行時創建DSN,可以使用SQLConfigDataSource API。在內部,這些信息存儲在註冊表中。語法附在下面

SQLConfigDataSource(NULL,ODBC_ADD_DSN," Microsoft Access驅動程序(*。mdb)\0”,“DSN = TestDB \ 0 dbq = D:\ \ Database \ \ friends . MDB \ 0 default dir = D:\ \ Database \ 0 \ 0”);

問題是,如果妳想接受來自用戶的值或者在運行時通過傳遞CString或char*來設置這些值是行不通的。這是因為,當sprintf遇到/0時,它會假設它是字符串的結尾,並忽略其余的數據。

作為壹種變通辦法,妳必須使用下面提到的代碼。

下面的代碼放在:應該是/ 0的地方,並且有壹個用“/0”替換“:”的循環。您將無法使用sprintf,因為當它遇到/0時,它會假定它是字符串的結尾,並忽略其余的數據。

char * szDesc

int mlen

szDesc = new char[256];

sprintf(szDesc," DSN=%s: DESCRIPTION=TOC支持來源:DBQ = % s:FIL = Microsoft access:default dir = D:\ \ Database::"," TestDB "," D:\ \ friends . MDB ");

mlen = strlen(szDesc);

for(int I = 0;我& ltmleni++)

{

if (szDesc[i] == ':')

szDesc[I]= ' \ 0 ';

}

if(FALSE = = SQLConfigDataSource(NULL,ODBC_ADD_DSN," Microsoft Access Driver (*。mdb)\0 ",(LPCSTR)szDesc))

MessageBox(hwnd,“失敗”,“信息”,MB _ OK);

其他

MessageBox(hwnd,“成功”,“信息”,MB _ OK);

  • 上一篇:車床刀具怎麽磨視頻
  • 下一篇:藍鯨編程機器人汽車編程
  • copyright 2024編程學習大全網