亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        消防監(jiān)控系統(tǒng)中動(dòng)態(tài)配置ODBC數(shù)據(jù)源的VC程序?qū)崿F(xiàn)

        2018-11-01 05:19:12盧志強(qiáng)
        電腦知識(shí)與技術(shù) 2018年18期

        盧志強(qiáng)

        摘要:面對(duì)客戶提出的數(shù)據(jù)庫(kù)中心需要由固定IP地址改為可動(dòng)態(tài)修改的IP,以適應(yīng)機(jī)房變更的需求,而且可能會(huì)在同一個(gè)應(yīng)用程序中訪問(wèn)不同的數(shù)據(jù)庫(kù),作者在程序中自動(dòng)完成這一工作的方法,快速滿足了客戶的需求。該文將詳細(xì)介紹動(dòng)態(tài)配置數(shù)據(jù)源的方法。

        關(guān)鍵詞:ODBC 數(shù)據(jù)源;動(dòng)態(tài)配置;VC

        中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)18-0063-01

        1 引言

        本人項(xiàng)目組開(kāi)發(fā)了某消防監(jiān)控系統(tǒng),采用VC開(kāi)發(fā)實(shí)現(xiàn),使用固定配置的ODBC數(shù)據(jù)源,而系統(tǒng)交付后遇到客戶需求更改,提出原設(shè)計(jì)的數(shù)據(jù)庫(kù)中心需要由固定IP地址改為可動(dòng)態(tài)修改的IP,以適應(yīng)機(jī)房變更的需求,而且可能會(huì)在同一個(gè)應(yīng)用程序中訪問(wèn)不同的數(shù)據(jù)庫(kù),因此采用一般的加載方法就有了無(wú)法克服的缺陷。如果能在程序中自動(dòng)完成這一工作,將能快速滿足客戶的需求。那么該如何通過(guò)程序代碼完成數(shù)據(jù)源的注冊(cè)呢?本文將詳細(xì)介紹動(dòng)態(tài)配置數(shù)據(jù)源的方法。

        2 VC中加載數(shù)據(jù)源的具體實(shí)現(xiàn)

        在VC中注冊(cè)O(shè)DBC數(shù)據(jù)源一般有兩種方法:利用函數(shù)SQLConfigDataSource和修改注冊(cè)表。本文重點(diǎn)介紹利用函數(shù)SQLConfigDataSource的方法。

        如果只是靜態(tài)的配置ODBC數(shù)據(jù)源,即數(shù)據(jù)源各參數(shù)(數(shù)據(jù)源名稱、服務(wù)器、數(shù)據(jù)庫(kù)文件路徑、數(shù)據(jù)庫(kù)名等)是固定的,那么使用SQLConfigDataSource函數(shù)可以輕松的實(shí)現(xiàn)程序配置數(shù)據(jù)源,舉例如下:

        if(SQLConfigDataSource(NULL, ODBC_ADD_DSN, "SQL Server",

        "DSN=EINet\0"

        "SERVER=192.168.1.100\0"

        "DATABASE=myEIfireDB\0"

        "Trusted_Connection=Yes\0")==1)

        AfxMessageBox("Success!");

        上面的代碼也可以寫(xiě)成:

        if(SQLConfigDataSource(NULL, ODBC_ADD_DSN, "SQL Server", "DSN=EINet\0SERVER=192.168.1.100\0DATABASE=myEIfireDB\0Trusted_Connection=Yes")==1)

        AfxMessageBox("Success!");

        函數(shù)最后一個(gè)參數(shù)(lpszAttributes)為一連串的"KeyName = value"字符串,每?jī)蓚€(gè)KeyName值之間用""隔開(kāi),連續(xù)的兩個(gè)引號(hào),相當(dāng)于連接符號(hào),使用它們可以便于新代碼排版,這比在行結(jié)尾處加連接符"\"更方便。lpszAttributes的具體設(shè)置,可以參考Windows系統(tǒng)目錄下幫助文件odbcjtn.hlp主題目錄標(biāo)簽中的“ODBC API函數(shù)改變|SQLConfigDataSource”條目。而尤其值得說(shuō)明的是每個(gè)"KeyName = value"字符串都必須以"\0"結(jié)尾,這就造成了動(dòng)態(tài)設(shè)定lpszAttributes的困難,先看這段代碼:

        CString strSource;

        CString strIP = _T("192.168.1.100");

        strSource.Format("DSN=EINet\0SERVER=\"%s\"\0DATABASE=myEIfireDB\0Trusted_Connection=Yes",strIP);

        LPCSTR lpszAttributes = (LPCSTR)strSource;

        if(SQLConfigDataSource(NULL,ODBC_ADD_DSN,"SQL Server",lpszAttributes)==1)

        AfxMessageBox("Success!");

        else

        AfxMessageBox("Fail!");

        運(yùn)行結(jié)果:Fail!

        單步調(diào)試觀察變量變化:

        發(fā)現(xiàn)lpszAttributes僅包含"DSN=EINet"的信息,其他配置數(shù)據(jù)源的信息都丟失了,原因在于CString默認(rèn)以"\0"作為字符串的結(jié)束標(biāo)志,在強(qiáng)制類型轉(zhuǎn)換時(shí)造成了數(shù)據(jù)丟失。

        解決辦法為:使用編碼轉(zhuǎn)換,在堆棧中分配內(nèi)存,創(chuàng)建一個(gè)char型數(shù)組,將lpszAttributes中的"\0"用"#"來(lái)表示,然后將數(shù)組中的字符賦給CString字符串,用CString的Replace方法再將"#"替換為"\0"。

        具體代碼如下:

        BOOL AddDSN(CString strServerIP)

        {

        USES_CONVERSION;

        _TCHAR buffer[MAX_PATH] = {0};

        LPCTSTR lpstrServerIP = strServerIP;

        _stprintf(buffer, _T("DSN= eiSource #")_T("SERVER=%s#") _T("DATABASE=eiDB#")_T("Trusted_Connection=Yes#"),lpstrServerIP);

        CString strAttributes = buffer;

        int len = strAttributes.GetLength();

        strAttributes.Replace(_T('#'), _T('\0'));

        return SQLConfigDataSource(NULL, ODBC_ADD_DSN, "SQL Server", strAttributes.GetBuffer(len));

        }

        上面兩個(gè)函數(shù)中用到的USES_CONVERSION是ATL中的一個(gè)宏定義。用于編碼轉(zhuǎn)換(用的比較多的是CString的LPCWSTR轉(zhuǎn)換)。在ATL下使用要包含頭文件atlconv.h,使用時(shí)一定要小心,它們從堆棧上分配內(nèi)存,直到調(diào)用它的函數(shù)返回,該內(nèi)存不會(huì)被釋放。如果在一個(gè)循環(huán)中,這個(gè)宏被反復(fù)調(diào)用幾次,將不可避免的產(chǎn)生stackoverflow。為避免這種情況發(fā)生,同時(shí)減小代碼量,在VC下可以更方便地直接使用下列代碼:

        BOOL ConfigDSN(CString strServerIP){

        _TCHAR buffer[MAX_PATH] = {0};

        LPCTSTR lpstrServerIP = strServerIP;

        sprintf(buffer, _T("DSN= eiSource #")_T("SERVER=%s#") _T("DATABASE=eiDB#")_T("Trusted_Connection=Yes#"),lpstrServerIP);

        CString strAttributes = buffer;

        strAttributes.Replace(_T('#'), _T('\0'));

        return SQLConfigDataSource(NULL, ODBC_CONFIG_DSN, "SQL Server", strAttributes);

        }

        調(diào)用上述自定義函數(shù):

        CString strServerIP = _T("192.168.1.100");

        if(AddDSN(strServerIP))

        AfxMessageBox("Success!");

        執(zhí)行代碼后結(jié)果:Success!

        可以看到,程序順利地執(zhí)行,成功配置好了數(shù)據(jù)源。

        3 結(jié)束語(yǔ)

        從以上分析和運(yùn)行結(jié)果可以看出:利用函數(shù)SQLConfigDataSource和修改注冊(cè)表,都可以實(shí)現(xiàn)動(dòng)態(tài)修改數(shù)據(jù)源,尤其是可以實(shí)現(xiàn)多個(gè)數(shù)據(jù)源的切換,從而實(shí)現(xiàn)同一個(gè)應(yīng)用程序中訪問(wèn)不同的數(shù)據(jù)庫(kù)甚至通過(guò)IP地址切換實(shí)現(xiàn)訪問(wèn)同一數(shù)據(jù)源名的多個(gè)遠(yuǎn)程服務(wù)器。

        丰满多毛的大隂户视频| 亚洲精品偷拍自综合网| 一本无码中文字幕在线观| 国产精品_国产精品_k频道| 亚洲 成人 无码 在线观看| 黑人一区二区三区高清视频| 日产精品高潮一区二区三区5月| 精品国产一二三产品区别在哪| 日韩高清亚洲日韩精品一区| 免费人成黄页网站在线观看国内 | 国产av一区二区三区在线播放 | 精品国产一区二区三区亚洲人 | 伊人久久大香线蕉亚洲五月天| 日韩h网站| 中文字幕一区二区区免| 亚洲欧美中文日韩在线v日本| 国产无遮挡无码视频免费软件| 国产福利小视频在线观看| 一区二区三区四区午夜视频在线| 精品卡一卡二卡3卡高清乱码| 亚洲av无码片在线观看| 成人综合久久精品色婷婷| 少妇被爽到高潮喷水免费福利| 97精品久久久久中文字幕| 欧美一区波多野结衣第一页| 亚洲产在线精品亚洲第一页| 激情综合婷婷色五月蜜桃| 日本又黄又爽gif动态图| 久久久国产精品ⅤA麻豆百度| 男男啪啪激烈高潮无遮挡网站网址 | 亚洲av无码av日韩av网站| 精品国产AⅤ一区二区三区V免费| 久久久亚洲av成人乱码| 好吊妞无缓冲视频观看| 午夜一级韩国欧美日本国产| 激情视频在线观看免费播放| 久久亚洲av成人无码国产最大| 亚洲欧美日韩精品久久亚洲区| 久久亚洲aⅴ精品网站婷婷| 一区二区三区四区在线观看日本| 国产深夜男女无套内射|