?? chap10_9.htm
字號:
<html>
<head>
<title>10.9 自動注冊DSN和創建表</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<link rel="stylesheet" href="../../../cpcw.css"></head>
<body link="#3973DE" alink="#3973DE" background="../../bg.gif">
<div align="center"><center>
<table width="85%" border="0">
<tr bgcolor="#FFFFFF">
<td>
<div align="center">
<center>
</center>
</div>
<p align="CENTER"><b><font face="Times New Roman" color="red">10.9 </font><font color="red">自動注冊</font><font face="Times New Roman" color="red">DSN</font><font color="red">和創建表</font></b></p>
<p align="JUSTIFY"> <font face="Times New Roman" size="4"></font> 在開始編寫自己的數據庫應用程序時,讀者很快會遇到兩個令人頭痛的問題。一是在訪問ODBC數據源前,必須在ODBC管理器中手工注冊DSN(數據源名)。這樣的應用程序要求用戶作額外的工作,顯得很不專業。另一個問題是AppWizard和ClassWizard并不支持表的創建,程序員似乎必須先用DBMS創建好表,然后才能使用。如果一個數據庫應用程序不能自己創建表,那么它的功能將大打折扣。</p>
<p align="JUSTIFY"> 事實上,通過一些技巧,可以使應用程序能夠對用戶透明地注冊DSN并任意創建表。本節的目的就是教會讀者如何解決這兩個問題。在下面幾個小節中,分別提供了ODBC和DAO的解決方案。</p>
<p align="JUSTIFY"><b></b><font color="#3973DE" face="Times New Roman">10.9.1
</font><font color="#3973DE">自動注冊</font><font color="#3973DE" face="Times New Roman">DSN</font></p>
<p align="JUSTIFY"><b></b> 無論是用ODBC還是DAO類,在訪問ODBC數據源以前,都必須先注冊DSN。通過調用函數SQLConfigDataSource,可以實現自動注冊DSN。當然,用DAO可以直接訪問一些常用的數據庫,而不必通過ODBC來訪問(參見10.8.3)。</p>
<p align="JUSTIFY"> 清單10.14的代碼演示了注冊DSN的過程。該段代碼先用SQLConfigDataSource注冊一個名為MYDB的FoxPro
2.5數據源,然后調用CDatabase::Open函數與該數據源連接。注意在使用這段代碼時,要包含afxdb.h頭文件,讀者可以把該文件放到stdafx.h中。</p>
<p align="JUSTIFY"><b> </b></p>
<b>
<p align="JUSTIFY">清單10.14 自動注冊DSN</p>
</b>
<p align="JUSTIFY">#include “afxdb.h”</p>
<p align="JUSTIFY"><b>. . .</b></p>
<p align="JUSTIFY">CDatabase db;</p>
<p align="JUSTIFY">if(!SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft
FoxPro Driver (*.dbf)", </p>
<p align="JUSTIFY">"DSN=MYDB\0"</p>
<p align="JUSTIFY">"DefaultDir=c:\\mydir\0"</p>
<p align="JUSTIFY">"FIL=FoxPro 2.5\0"</p>
<p align="JUSTIFY">"DriverId=280\0"))</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">AfxMessageBox("Can't add DSN!");</p>
<p align="JUSTIFY">return ;</p>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY">TRY</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">db.Open("MYDB");</p>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY">CATCH(CDBException, e)</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">AfxMessageBox(e->m_strError);</p>
<p align="JUSTIFY">return;</p>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY">END_CATCH</p>
<p align="JUSTIFY"> 在注冊DSN時,SQLConfigDataSource函數的第二個參數應該是ODBC_ADD_DSN,第三個參數指定了ODBC驅動程序,它的寫法可以參照ODBC管理器的驅動程序頁。第四個參數說明了數據源的各種屬性,它是由一系列子串構成,每個子串的末尾必須有一個“\0”。最重要的屬性是“DSN=數據源名”,其它屬性包括缺省目錄以及驅動程序版本信息。在上例中,使用FoxPro
2.5的版本,所以DriverId應該是280,對應地,FoxPro 2.6的DriverId是536,FoxPro 2.0的是24。</p>
<p align="JUSTIFY"> 如果讀者對SQLConfigDataSource函數的第四個參數的設置方法不清楚,那么可以打開Windows的注冊表看一看已注冊過的DSN的各項屬性。運行RegEdit可以打開注冊表,然后依次打開HKEY_CURRENT_USER->Software->ODBC->ODBC.INI,就可以看到已注冊的DSN,打開各DSN,則可以看到該DSN的各項屬性,讀者可以仿照DSN屬性來設置第四個參數。</p>
<p align="JUSTIFY">DSN的名字必須唯一,因此如果要注冊的DSN已被注冊過,那么SQLConfigDataSource就修改原來DSN的屬性。</p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY"><font color="#3973DE" face="Times New Roman">10.9.2
</font><font color="#3973DE">用ODBC創建表</font></p>
<p align="JUSTIFY"> 由于ODBC類不支持DDL,所以只有通過ODBC API來創建表。程序需要調用Cdatabase
:: ExecuteSQL來直接執行SQL語句。</p>
<p align="JUSTIFY"> 清單10.15給出了創建表的一個例子,該程序先自動注冊了一個名為MYDB的FoxPro 2.5數據源,然后創建了一個名為OFFICES的表(OFFICES.DBF文件),在這個表中有OfficeID和OfficeName兩個TEXT型字段,長度分別為4和10個字節。注意,如果要使用這段代碼,則需要包含afxdb.h和odbcinst.h。</p>
<p align="JUSTIFY">清單10.15 ODBC創建表的例子</p>
<b></b>
<p align="JUSTIFY">#include “afxdb.h”</p>
<p align="JUSTIFY">#include "odbcinst.h"</p>
<p align="JUSTIFY"><b>. . .</b></p>
<p align="JUSTIFY">CDatabase db;</p>
<p align="JUSTIFY">if(!SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft
FoxPro Driver (*.dbf)", </p>
<p align="JUSTIFY">"DSN=MYDB\0"</p>
<p align="JUSTIFY">"DefaultDir=c:\\mydir\0"</p>
<p align="JUSTIFY">"FIL=FoxPro 2.5\0"</p>
<p align="JUSTIFY">"DriverId=280\0"))</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">AfxMessageBox("Can't add DSN!");</p>
<p align="JUSTIFY">return ;</p>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY">TRY</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">db.Open("MYDB");</p>
<blockquote>
<blockquote>
<p align="JUSTIFY">db.ExecuteSQL("CREATE TABLE OFFICES (OfficeID
TEXT(4)" </p>
<p align="JUSTIFY">",OfficeName TEXT(10))"); }</p>
</blockquote>
</blockquote>
<p align="JUSTIFY">CATCH(CDBException, e)</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">AfxMessageBox(e->m_strError);</p>
<p align="JUSTIFY">return;</p>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY">END_CATCH</p>
<p align="JUSTIFY"> ExecuteSQL執行了一個實實在在的SQL語句CREATE來創建表,看來用戶應該找本SQL方面的書研究研究。要注意一個數據庫中的表名必須是唯一的,如果要創建的表已經存在,則ExecuteSQL會產生一個異常。</p>
<p align="JUSTIFY"><font color="#3973DE" face="Times New Roman">10.9.3
</font><font color="#3973DE">用DAO創建表</font></p>
<p align="JUSTIFY"> 由于DAO類直接支持DDL,所以用DAO類創建表比ODBC容易。DAO的CDaoTableDef類提供了對表的結構的定義,該類提供了創建表的成員函數。</p>
<p align="JUSTIFY"> 清單10.16演示了一段用DAO類創建表的例子。注意,若要使用這段代碼,則應該包含afxdao.h頭文件。在該例中,先與一個FoxPro
2.5數據庫連接(實際上是一個目錄),然后再構建一個CDaoTableDef對象,接著調用CDaoTableDef :: Create函數創建一個名為STUDENTS的表(STUDENTS.DBF),調用CDaoTableDef
:: CreateField為該表創建了兩字段,字段名分別是ID和NAME,類型分別是Integer和dbText,字段的長度分別為2和10個字節。最后調用CDaoTableDef
:: Append把新創建的表保存到數據庫中。</p>
<b>
<p align="JUSTIFY">清單10.16 DAO創建表的例子</p>
</b>
<p align="JUSTIFY">#include “afxdao.h”</p>
<p align="JUSTIFY"><b>. . .</b></p>
<p align="JUSTIFY">CDaoDatabase daoDb;</p>
<p align="JUSTIFY">try</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">daoDb.Open("",FALSE,FALSE,"FoxPro
2.5;DATABASE=d:\\zwin");</p>
<p align="JUSTIFY">CDaoTableDef table(&daoDb);</p>
<p align="JUSTIFY">table.Create("STUDENTS");</p>
<p align="JUSTIFY">table.CreateField("ID",dbInteger,2);</p>
<p align="JUSTIFY">table.CreateField("NAME",dbText,10);</p>
<p align="JUSTIFY">table.Append();</p>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY">catch(CDaoException* e)</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">AfxMessageBox(e-></p>
<p align="JUSTIFY">m_pErrorInfo->m_strDescription);</p>
<p align="JUSTIFY">e->Delete();</p>
<p align="JUSTIFY">return FALSE;</p>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY"> 關于CDaoDatabase :: Open的說明請參見10.8.3。注意一個數據庫中的表名必須是唯一的,如果要創建的表已經存在,則CDaoTableDef
:: Create會產生一個異常。</p>
<div align="center">
<center>
<table border="0" cellpadding="0" cellspacing="0" width="615">
<tr>
<td><a href="chap10_8.htm">上一頁</a></td>
<td>
<p align="right"><a href="chap1010.htm">下一頁</a>
</td>
</tr>
</table>
<p><a href="http://www.cpcw.com">電腦報首頁</a> <a href="../../index.htm">網絡學院首頁</a></p>
</center>
</div>
<font size="5">
<hr noshade color="#3973DE" size="1">
</font>
<p align="center"><font size="5"></font><font size="2" color="#000000">本教程由<a href="http://vcdynasty.yeah.net">Visual
C++王朝(Where programmers come together)</a>協助制作<br>
未經許可,請勿以任何形式復制</font>
</td>
</tr>
</table>
</center>
</div>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -