當前位置:首頁 » 存儲配置 » 為什麼要把數據源做成可配置

為什麼要把數據源做成可配置

發布時間: 2022-07-23 13:26:50

A. 什麼是數據源配置

數據表設計就是將資料庫的設計表單化
資料庫連接和數據源配置就是通過系統的設置和配置將資料庫的連接信息寫入程序中,在程序需要從資料庫中提取或存放數據時能夠找到資料庫的位置,其中資料庫的連接就是建立前台和資料庫的連接,而數據源的配置就是告訴程序資料庫在什麼地方,是以什麼形式存放的

B. 資料庫編程 為什麼要設置數據源

在VC中動態載入ODBC的方法

在使用 VC、 VB、 Delphi等高級語言編寫資料庫應用程序時,往往需要用戶自己在控制面板中配置 ODBC數據源。對於一般用戶而言,配置 ODBC數據源可能是一件比較困難的工作。而且,在實際應用中,用戶往往要求在同一個應用程序中訪問不同的數據源,因此採用一般的載入方法就有了無法克服的缺陷。為能在程序中完成這一工作,方便應用程序的使用,本文以 VC為開發環境介紹兩種在應用程序中動態載入 ODBC系統數據源的方法。
方法一:修改注冊表
設計思路
一般情況下,當用戶在控制面板中配置好 ODBC數據源後, Windows系統便在注冊表中加入了一些子鍵來存儲用戶的配置結果。當應用程序需要用到數據源時, Windows便會通知底層介面查閱注冊表中該數據源的配置。如果用戶刪除了某個 ODBC數據源,那麼也會在注冊表中有所反應。如果配置的數據源是用戶數據源, Windows系統便會修改注冊表的 HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI子鍵;如果配置的數據源是系統數據源, Windows系統便會修改注冊表的 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI主鍵。因此,我們可以在應用程序中使用 Windows API中的注冊表編輯函數來完成 Windows所做的工作,這樣就可以達到動態載入數據源的目的。
具體實現
對於不同類型的數據源,注冊表的修改也各有不同,但基本上都要修改兩個地方。一個是在 ODBC.INI子鍵下建立一個與數據源描述名同名的子鍵,並在該子鍵下建立與數據源配置相關的項;另一個是在 \ODBC.INI\ODBC Data Sources子鍵下建立一個新項以便告訴驅動程序管理器 ODBC數據源的類型。下面以配置一個 Microsoft Access數據源為例給出實現此功能的函數的代碼。
/* strSourceName是要創建的數據源名, strSourceDb是資料庫存放路徑, strDescription是數據源的描述字元串。* /
BOOL CLoadOdbcDlg:: LoadDbSource(CString strSourceName,CString strSourceDb, CString strDescription)
{
//存放打開的注冊表鍵
HKEY hKey;
DWORD dw;
//存放注冊表 API函數執行的返回值
LONG lReturn;
//存放要打開的子鍵
CString strSubKey;
//檢測是否安裝了 MS Access ODBC driver:odbcjt32.dll
//獲得 Windows系統目錄
char sysDir[MAX_PATH];
char drvName[]=" \\odbcjt32.dll" ;
::GetSystemDirectory (sysDir,MAX_PATH);
strcat(sysDir,drvName);
CFileFind findFile;
if(!findFile.FindFile (sysDir))
{
AfxMessageBox("您的計算機系統中沒有安裝 MS Access的 ODBC驅動程序 odbcjt32.dll,您將無法載入該類數據源。 " ,MB_OK|MB_ICONSTOP);
return false;
}
strSubKey=" SOFTWARE\\ODBC\\ODBC.INI\\"+ strSourceName;
//創建 ODBC數據源在注冊表中的子鍵
lReturn=::RegCreateKeyEx(HKEY_LOCAL_
MACHINE,(LPCTSTR)strSubKey,0,NULL,REG_OPTION
_NON_VOLATILE,KEY_WRITE,NULL,& hKey,& dw);
if(lReturn != ERROR_SUCCESS)
return 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),strDescription.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," SafeTransactions" ,0L,
REG_DWORD,(CONST BYTE* )(& dwSafeTransactions),sizeof(dw));
::RegSetValueEx (hKey," UID" ,0L,REG_SZ,
(CONST BYTE* )((LPCTSTR)strUid),strUid .GetLength ()); ::RegCloseKey(hKey);
//創建 ODBC數據源的 Jet子鍵
strSubKey+ =" \\Engines\\Jet" ;
lReturn=::RegCreateKeyEx (HKEY_LOCAL_MACHINE ,(LPCTSTR)strSubKey,0,NULL,REG_OPTION_NON_
VOLATILE,KEY_WRITE,NULL,& hKey,& dw);
if(lReturn != ERROR_SUCCESS)
return false;
//設置該子鍵下的各項參數
CString strImplict=" " ;
CString strUserCommit=" Yes" ;
DWORD dwPageTimeout=5;
DWORD dwThreads=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),strUserCommit.GetLength ());
::RegCloseKey (hKey);
//設置 ODBC資料庫引擎名稱
lReturn=::RegOpenKeyEx (HKEY_LOCAL_MACHINE, " SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources" ,0L,KEY_WRITE,& hKey);
if(lReturn !=ERROR_SUCCESS)
return false;
CString strDbType=" Microsoft Access Driver (* .mdb)" ; ::RegSetValueEx (hKey,strSourceName,0L,REG_SZ,(CONST BYTE* )((LCTSTR)strDbType),strDbType.GetLength ());
return true;
}
由於在動態載入中,一般只會改變資料庫文件、數據源說明以及數據源描述,故上述函數可以實現應用中的大部分要求。如果應用中還需要作更多的改變,那麼也可以通過改變函數參數的方式加以實現。對於需要動態載入多種類型數據源的情況,可以用具有不同參數的重載函數去實現。
方法二:利用 DLL
設計思路
Windows系統子目錄中的動態鏈接庫 Odbcinst.dll提供了一個可以動態地增加、修改和刪除數據源的函數 SQLConfigDataSource()。該函數的原型如下:
BOOL SQLConfigDataSource(HWND hwndParent,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參數用於傳遞資料庫引擎的名字,等同於方法一中 strDbType變數。
lpszAttirbutes參數是關鍵字的值,即一連串的 " keyname=value"字元串,每兩個字元串之間用 " \"隔開,如 DSN=Personnel Data\0UID=Smith\0DATABASE=Personnel。關於該參數的詳細設置請參閱 MSDN中 SQLConfigDataSource()函數的幫助文檔和各種 ODBC驅動程序文檔。
具體實現
由於 VC的預設庫文件中不包含 SQLConfigDataSource()函數,因此使用該函數之前需要將 odbcinst.h文件包含在工程的頭文件中,在工程的 Settings屬性對話框 Link屬性頁的 Object/library moles編輯框中增加 odbc32.lib,同時保證系統目錄 system32下有文件 odbccp32.dll。
仍以 Microsoft Access為例,設置數據源名為 demo,數據源描述為 "示例數據源 ",那麼在需要動態載入數據源的地方加入下列代碼即可:
::SQLConfigDataSource (NULL,ODBC_ADD_SYS_DSN," Microsoft Access Driver (* .mdb)"," DSN=demo\0Descirption=示例資料庫 " );
小結
上述兩種方法都可以實現動態載入各種類型的 ODBC數據源,並且在 Windows95/98/NT/2000環境下調試通過。方法一在實現時需要較多的代碼,方法二所需代碼雖少,但需要額外文件的支持,而且隨著數據源配置的靈活性的增加,為了形成 lpszAttributes字元串,其代碼長度也會相應增加。由於從控制面板配置數據源使得程序員可以獲得更加直觀的理解,所以對於注冊表中各項值以及相應項名稱的獲得除了可以查閱相關驅動程序的文檔外,程序員也可以在編程前先通過控制面板配置 ODBC數據源,然後根據注冊表中相應部分的內容進行編程。

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

Create Access data source name dynamically

This article was contributed by Madhava V.
This sample in this article was created using VC 5.0. The necessary .h and .lib files are present in the zip.
To create a DSN at run time you could use the SQLConfigDataSource API. Internally this information is stored in the registry. The syntax is attached below
SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0","DSN=TestDB\0DBQ=D:\\Database\\Friends.mdb\0DEFAULTDIR=D:\\DATABASE\0\0");
The problem is that if you want to accept the values from the user or set these values at run time by passing CString or char* will not work. This is because, when sprintf encounters a /0 it assumes it is the end of the string and ignores the rest of the data.
As a workaround you have to use the below mentioned code.
The following code places : where a /0 is expected and there is a loop which replaces a ":" with "/0". You will not be in a position to use sprintf because, when it encounters a /0 it assumes it is the end of the string and ignores the rest of the data.

char* szDesc;
int mlen;
szDesc=new char[256];
sprintf(szDesc,"DSN=%s: DESCRIPTION=TOC support source: DBQ=%s: FIL=MicrosoftAccess: DEFAULTDIR=D:\\Database:: ","TestDB","D:\\Friends.mdb");
mlen = strlen(szDesc);
for (int i=0; i <mlen; i++)
{
if (szDesc[i] == ':')
szDesc[i] = '\0';
}

if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)szDesc))
MessageBox(hwnd,"Failed","INFORMATION",MB_OK);
else
MessageBox(hwnd,"Sucess","INFORMATION",MB_OK);

C. 為什麼要在tomcat中配置數據源

因為這是java和jsp軟體運行的一個必要程序啊,如果不配置,那麼就無法發布網站,也就無法運行結果!

D. ssh中spring為什麼還要配置數據源,hibernate不是已經配置資料庫連接。

因為spring
的面向切面,和控制反轉,更好的控制了資料庫的連接。這樣hibernate只管數據的操作,不管資料庫連接。spring在ssh中起的作用就是降低與hibernate和struts的耦合度。
希望幫助到你。

E. 為什麼要設置數據源 怎樣設置Access數據源

設置數據源,就相當於打電話撥號一樣,只有撥通了才能通話,這也一樣,建立數據源實現了網站中IIS對資料庫的訪問連接。具體方法如下:
1、在控制面板中,雙擊管理工具,然後打開ODBC數據源管理器。
2、在「系統DSN」選項卡中,單擊「添加」按鈕,打開「創建新數據源」對話框,在「名稱」列表框中選擇「Driver
do
Microsoft
Access(*.mdb)」點擊『完成』。
3、在出現的
odbc
microsoft
access
安裝中,填寫『數據源名』(隨便起個名),單擊『選擇』按鈕選擇你的資料庫文件(進行連接),沒有的話點擊旁邊的『創建』。操作完成後單擊『確定』。
4、odbc操作基本完成了,剩下的操作就是設置你要進行操作的軟體了。

F. java資料庫一定要配置數據源嗎

不是,是java程序如果用到資料庫的時候一定要做資料庫連接操作

熱點內容
文件夾兩孔 發布:2024-10-06 23:48:53 瀏覽:351
ftp工具分析 發布:2024-10-06 23:48:51 瀏覽:157
伺服器被游戲封機器碼怎麼辦 發布:2024-10-06 23:46:10 瀏覽:160
股票java 發布:2024-10-06 23:38:46 瀏覽:290
安卓演算法 發布:2024-10-06 23:14:20 瀏覽:183
域名訪問404 發布:2024-10-06 23:08:52 瀏覽:708
訪問筆錄模版 發布:2024-10-06 22:36:54 瀏覽:140
多用途編程 發布:2024-10-06 22:35:58 瀏覽:617
msde2000資料庫下載 發布:2024-10-06 22:33:35 瀏覽:44
什麼配置可以算神機 發布:2024-10-06 21:52:09 瀏覽:422