10.9 自动注册DSN和创建表
10.9 自動(dòng)注冊(cè)DSN和創(chuàng)建表
在開(kāi)始編寫(xiě)自己的數(shù)據(jù)庫(kù)應(yīng)用程序時(shí),讀者很快會(huì)遇到兩個(gè)令人頭痛的問(wèn)題。一是在訪問(wèn)ODBC數(shù)據(jù)源前,必須在ODBC管理器中手工注冊(cè)DSN(數(shù)據(jù)源名)。這樣的應(yīng)用程序要求用戶(hù)作額外的工作,顯得很不專(zhuān)業(yè)。另一個(gè)問(wèn)題是AppWizard和ClassWizard并不支持表的創(chuàng)建,程序員似乎必須先用DBMS創(chuàng)建好表,然后才能使用。如果一個(gè)數(shù)據(jù)庫(kù)應(yīng)用程序不能自己創(chuàng)建表,那么它的功能將大打折扣。
事實(shí)上,通過(guò)一些技巧,可以使應(yīng)用程序能夠?qū)τ脩?hù)透明地注冊(cè)DSN并任意創(chuàng)建表。本節(jié)的目的就是教會(huì)讀者如何解決這兩個(gè)問(wèn)題。在下面幾個(gè)小節(jié)中,分別提供了ODBC和DAO的解決方案。
10.9.1 自動(dòng)注冊(cè)DSN
無(wú)論是用ODBC還是DAO類(lèi),在訪問(wèn)ODBC數(shù)據(jù)源以前,都必須先注冊(cè)DSN。通過(guò)調(diào)用函數(shù)SQLConfigDataSource,可以實(shí)現(xiàn)自動(dòng)注冊(cè)DSN。當(dāng)然,用DAO可以直接訪問(wèn)一些常用的數(shù)據(jù)庫(kù),而不必通過(guò)ODBC來(lái)訪問(wèn)(參見(jiàn)10.8.3)。
清單10.14的代碼演示了注冊(cè)DSN的過(guò)程。該段代碼先用SQLConfigDataSource注冊(cè)一個(gè)名為MYDB的FoxPro 2.5數(shù)據(jù)源,然后調(diào)用CDatabase::Open函數(shù)與該數(shù)據(jù)源連接。注意在使用這段代碼時(shí),要包含afxdb.h頭文件,讀者可以把該文件放到stdafx.h中。
清單10.14 自動(dòng)注冊(cè)DSN
#include “afxdb.h”
. . .
CDatabase db;
if(!SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft FoxPro Driver (*.dbf)",
"DSN=MYDB/0"
"DefaultDir=c://mydir/0"
"FIL=FoxPro 2.5/0"
"DriverId=280/0"))
{
AfxMessageBox("Can't add DSN!");
return ;
}
TRY
{
db.Open("MYDB");
}
CATCH(CDBException, e)
{
AfxMessageBox(e->m_strError);
return;
}
END_CATCH
在注冊(cè)DSN時(shí),SQLConfigDataSource函數(shù)的第二個(gè)參數(shù)應(yīng)該是ODBC_ADD_DSN,第三個(gè)參數(shù)指定了ODBC驅(qū)動(dòng)程序,它的寫(xiě)法可以參照ODBC管理器的驅(qū)動(dòng)程序頁(yè)。第四個(gè)參數(shù)說(shuō)明了數(shù)據(jù)源的各種屬性,它是由一系列子串構(gòu)成,每個(gè)子串的末尾必須有一個(gè)“/0”。最重要的屬性是“DSN=數(shù)據(jù)源名”,其它屬性包括缺省目錄以及驅(qū)動(dòng)程序版本信息。在上例中,使用FoxPro 2.5的版本,所以DriverId應(yīng)該是280,對(duì)應(yīng)地,FoxPro 2.6的DriverId是536,FoxPro 2.0的是24。
如果讀者對(duì)SQLConfigDataSource函數(shù)的第四個(gè)參數(shù)的設(shè)置方法不清楚,那么可以打開(kāi)Windows的注冊(cè)表看一看已注冊(cè)過(guò)的DSN的各項(xiàng)屬性。運(yùn)行RegEdit可以打開(kāi)注冊(cè)表,然后依次打開(kāi)HKEY_CURRENT_USER->Software->ODBC->ODBC.INI,就可以看到已注冊(cè)的DSN,打開(kāi)各DSN,則可以看到該DSN的各項(xiàng)屬性,讀者可以仿照DSN屬性來(lái)設(shè)置第四個(gè)參數(shù)。
DSN的名字必須唯一,因此如果要注冊(cè)的DSN已被注冊(cè)過(guò),那么SQLConfigDataSource就修改原來(lái)DSN的屬性。
10.9.2 用ODBC創(chuàng)建表
由于ODBC類(lèi)不支持DDL,所以只有通過(guò)ODBC API來(lái)創(chuàng)建表。程序需要調(diào)用Cdatabase :: ExecuteSQL來(lái)直接執(zhí)行SQL語(yǔ)句。
清單10.15給出了創(chuàng)建表的一個(gè)例子,該程序先自動(dòng)注冊(cè)了一個(gè)名為MYDB的FoxPro 2.5數(shù)據(jù)源,然后創(chuàng)建了一個(gè)名為OFFICES的表(OFFICES.DBF文件),在這個(gè)表中有OfficeID和OfficeName兩個(gè)TEXT型字段,長(zhǎng)度分別為4和10個(gè)字節(jié)。注意,如果要使用這段代碼,則需要包含afxdb.h和odbcinst.h。
清單10.15 ODBC創(chuàng)建表的例子
#include “afxdb.h”
#include "odbcinst.h"
. . .
CDatabase db;
if(!SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft FoxPro Driver (*.dbf)",
"DSN=MYDB/0"
"DefaultDir=c://mydir/0"
"FIL=FoxPro 2.5/0"
"DriverId=280/0"))
{
AfxMessageBox("Can't add DSN!");
return ;
}
TRY
{
db.Open("MYDB");
db.ExecuteSQL("CREATE TABLE OFFICES (OfficeID TEXT(4)"
",OfficeName TEXT(10))"); }
CATCH(CDBException, e)
{
AfxMessageBox(e->m_strError);
return;
}
END_CATCH
ExecuteSQL執(zhí)行了一個(gè)實(shí)實(shí)在在的SQL語(yǔ)句CREATE來(lái)創(chuàng)建表,看來(lái)用戶(hù)應(yīng)該找本SQL方面的書(shū)研究研究。要注意一個(gè)數(shù)據(jù)庫(kù)中的表名必須是唯一的,如果要?jiǎng)?chuàng)建的表已經(jīng)存在,則ExecuteSQL會(huì)產(chǎn)生一個(gè)異常。
10.9.3 用DAO創(chuàng)建表
由于DAO類(lèi)直接支持DDL,所以用DAO類(lèi)創(chuàng)建表比ODBC容易。DAO的CDaoTableDef類(lèi)提供了對(duì)表的結(jié)構(gòu)的定義,該類(lèi)提供了創(chuàng)建表的成員函數(shù)。
清單10.16演示了一段用DAO類(lèi)創(chuàng)建表的例子。注意,若要使用這段代碼,則應(yīng)該包含afxdao.h頭文件。在該例中,先與一個(gè)FoxPro 2.5數(shù)據(jù)庫(kù)連接(實(shí)際上是一個(gè)目錄),然后再構(gòu)建一個(gè)CDaoTableDef對(duì)象,接著調(diào)用CDaoTableDef :: Create函數(shù)創(chuàng)建一個(gè)名為STUDENTS的表(STUDENTS.DBF),調(diào)用CDaoTableDef :: CreateField為該表創(chuàng)建了兩字段,字段名分別是ID和NAME,類(lèi)型分別是Integer和dbText,字段的長(zhǎng)度分別為2和10個(gè)字節(jié)。最后調(diào)用CDaoTableDef :: Append把新創(chuàng)建的表保存到數(shù)據(jù)庫(kù)中。
清單10.16 DAO創(chuàng)建表的例子
#include “afxdao.h”
. . .
CDaoDatabase daoDb;
try
{
daoDb.Open("",FALSE,FALSE,"FoxPro 2.5;DATABASE=d://zwin");
CDaoTableDef table(&daoDb);
table.Create("STUDENTS");
table.CreateField("ID",dbInteger,2);
table.CreateField("NAME",dbText,10);
table.Append();
}
catch(CDaoException* e)
{
AfxMessageBox(e->
m_pErrorInfo->m_strDescription);
e->Delete();
return FALSE;
}
關(guān)于CDaoDatabase :: Open的說(shuō)明請(qǐng)參見(jiàn)10.8.3。注意一個(gè)數(shù)據(jù)庫(kù)中的表名必須是唯一的,如果要?jiǎng)?chuàng)建的表已經(jīng)存在,則CDaoTableDef :: Create會(huì)產(chǎn)生一個(gè)異常。
總結(jié)
以上是生活随笔為你收集整理的10.9 自动注册DSN和创建表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一文详解SVM的Soft-Margin机
- 下一篇: 逻辑回归还能这样解?关于Kernel L