日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

10.9 自动注册DSN和创建表

發(fā)布時(shí)間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 10.9 自动注册DSN和创建表 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題是AppWizardClassWizard并不支持表的創(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é)中,分別提供了ODBCDAO的解決方案。

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è)名為MYDBFoxPro 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.6DriverId536FoxPro 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è)名為MYDBFoxPro 2.5數(shù)據(jù)源,然后創(chuàng)建了一個(gè)名為OFFICES的表(OFFICES.DBF文件),在這個(gè)表中有OfficeIDOfficeName兩個(gè)TEXT型字段,長(zhǎng)度分別為410個(gè)字節(jié)。注意,如果要使用這段代碼,則需要包含afxdb.hodbcinst.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容易。DAOCDaoTableDef類(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)建了兩字段,字段名分別是IDNAME,類(lèi)型分別是IntegerdbText,字段的長(zhǎng)度分別為210個(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。