版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
通過ODBC連接數(shù)據(jù)庫(C++)C++連接數(shù)據(jù)庫的方法有很多種,在VisualC++和SQLserver的實(shí)際開發(fā)中,一般使用ODBC或ADO技術(shù)進(jìn)行開發(fā),相關(guān)技術(shù)和產(chǎn)品也最為成熟。我們這里根據(jù)課程需要采用ODBC的方法。我使用的平臺(tái)的是VS2010和SQLserver2008,優(yōu)點(diǎn)是VS2010支持一些比較新的特性,編程方便了很多,缺點(diǎn)是左側(cè)的“服務(wù)器資源管理器”不支持SQLserver2000,但是沒有關(guān)系,在SQLserver2008上是可以連上的,大家如果和我的平臺(tái)不一樣的話在編程細(xì)節(jié)上可能有些問題要注意下。有同學(xué)表示安裝了SQLserver2008之后只能通過“windows身份驗(yàn)證”登陸本地?cái)?shù)據(jù)庫,無法通過“SQLserver身份驗(yàn)證”登陸,這是由于安裝的時(shí)候是通過“windows身份驗(yàn)證”安裝的,改一下配置即可:1.使用“windows身份驗(yàn)證”登陸數(shù)據(jù)庫,點(diǎn)擊“登錄名”,右擊sa,朋務(wù)器角色彎用戶映射1.使用“windows身份驗(yàn)證”登陸數(shù)據(jù)庫,點(diǎn)擊“登錄名”,右擊sa,朋務(wù)器角色彎用戶映射選擇屬性,點(diǎn)擊狀態(tài),確保設(shè)置如設(shè)置狀態(tài)是否允許連接到數(shù)據(jù)庫引擎:左側(cè)圖所示。2.右擊本地服登錄:日服務(wù)韻1性-KOUEOUKEN-PC:拒絕登錄:日服務(wù)韻1性-KOUEOUKEN-PC:拒絕?務(wù)器名選擇屬性,更改安全性中的服務(wù)器身份驗(yàn)證如下圖所示迭擇頁青常規(guī)j*內(nèi)存迭擇頁青常規(guī)j*內(nèi)存舀處理器安全性滬;車t辛宙數(shù)據(jù)庫設(shè)置旨高級旨權(quán)限蜀腳本-門幫助朋務(wù)器身悅驗(yàn)證 Windows身儲(chǔ)驗(yàn)證欖式纜)aSQLServer和Windows身份驗(yàn)證複式富)3.右擊地服務(wù)器名選擇重新啟動(dòng)(這一部很重要)4.如何還有問題的話查看目錄“D:\ProgramFiles'MicrosoftSQLServer\MSSQL10.MSSQLSERVER\MSSQL\Log”下的ERRORLOG文件,找到錯(cuò)誤代碼,google之打開SQLserver2008連接一個(gè)我們測試用的數(shù)據(jù)庫,使用的10.214.6.98上的數(shù)據(jù)庫db27,用戶名和密碼都是user277,執(zhí)行以下命令:usedb27CREATETablebnocategorytitlepressbyearauthorpricetotalstockbookCREATETablebnocategorytitlepressbyearauthorpricetotalstockchar(8),char(10),varchar(40)notnull,varchar(30)notnull,intCHECK(byear>0),varchar(20)notnull,decimal(7,2)CHECK(price>0),intCHECK(total>=0),intCHECK(stock>=0),CONSTRAINTckCHECK(stock<=total)INSERTINTObookVALUES('12345678','數(shù)據(jù)庫','數(shù)據(jù)庫系統(tǒng)原理教程','清華大學(xué)出版社',1998,'王珊',27.9,3,0)INSERTINTObookVALUES('12342378','數(shù)據(jù)庫','數(shù)據(jù)庫','清華大學(xué)出版社',1998,'王珊',27.9,3,0)INSERTINTObookVALUES('12341278','數(shù)據(jù)庫','數(shù)據(jù)庫','清華大學(xué)出版社',1998,'王珊',27.9,3,0)INSERTINTObookVALUES('14345678','數(shù)據(jù)庫','數(shù)據(jù)庫','清華大學(xué)出版社',1998,'王珊',27.9,3,0)上面SQL語句執(zhí)行的結(jié)果是在db27數(shù)據(jù)庫中創(chuàng)建了一個(gè)名為book的表,里面有9列,隨后添加了4個(gè)測試數(shù)據(jù),現(xiàn)在將該數(shù)據(jù)源添加到ODBC數(shù)據(jù)源管理器中,打開路徑“控制面板\所有控制面板項(xiàng)\管理工具”下的數(shù)據(jù)源(ODBC),添加新的數(shù)據(jù)源,選擇“SQLServer”名稱設(shè)置為db27,服務(wù)器在10.214.6.98,使用user277用戶登錄,完成后點(diǎn)擊測試數(shù)據(jù)源看能不能連上,顯示測試成功后,在用戶數(shù)據(jù)源中會(huì)看到剛剛添加的DSN:
我們編寫一個(gè)簡單的圖形化界面,打開VS2010,新建項(xiàng)目,選擇“MFC應(yīng)用程序”,建立一個(gè)名為“DataBaseODBC”的項(xiàng)目,彈出的向?qū)е懈膽?yīng)用程序類型為“基于對話框”大家在實(shí)際編程中可以需要選擇,這里只是為了做個(gè)示例,其他保持默認(rèn)。點(diǎn)擊工具箱中“ListControl”空間,拖到面板中,完成之后應(yīng)該是下圖這個(gè)樣子:調(diào)整控件的view屬性為Report,如下圖所示,控件的樣式會(huì)有相應(yīng)的改變。Jil7$StaticJil7$StaticEdgeFalse>TransparentFalse1Vie--/?IconEJ題[con(NsmeJGroupSmallIw-nListIO.—Reportview具中之一;團(tuán)標(biāo)(:TrnnlXIcon),小團(tuán)標(biāo)5ilWriktiI&C.LCST1(ListControl)IListE*右擊ListContr,l添加變量,在對話框中輸入名稱,如m_ListCtrl將這個(gè)ListContrO設(shè)置成9列,并設(shè)置一些格式:CRectrc;m_ListCtrl.GetWindowRect(&rc);/獲取控件大小//殳置了9列,大小是一樣的mListCtrl.InsertColumn(0,"書號(hào)"),LVCFMTCENTER,rc.Size().cx/9,0);m_ListCtrl.lnsertColumn(1,_T("類別”),LVCFMT_CENTER,rc.Size().cx/9,1);m_ListCtrl.lnsertColumn(2,_T("書名"),LVCFMT_CENTER,rc.Size().cx/9,2);m_ListCtrl.InsertColumn(3,_T("出版社"),LVCFMT_CENTER,rc.Size().cx/9,3);m_ListCtrl.InsertColumn(4,_T("出版年份"),LVCFMT_CENTER,rc.Size().cx/9,4);m_ListCtrl.InsertColumn(5,_T("作者"),LVCFMT_CENTER,rc.Size().cx/9,5);m_ListCtrl.InsertColumn(6,_T("價(jià)格"),LVCFMT_CENTER,rc.Size().cx/9,6);m_ListCtrl.InsertColumn(7,_T("總藏書量"),LVCFMT_CENTER,rc.Size().cx/9,7);m_ListCtrl.InsertColumn(8,_T("目前庫存數(shù)"),LVCFMT_CENTER,rc.Size().cx/9,8);〃LVS_EX_GRIDLINES是希望顯示網(wǎng)格;〃LVS_EX_FULLROWSELECT是希望被選中時(shí)整行反色顯示;〃LVS_EX_HEADERDRAGDROP是讓其支持點(diǎn)擊表頭排序;〃LVS_EX_TWOCLICKACTIVATE是希望有鼠標(biāo)在未被選中的行上移動(dòng)的時(shí)候有一些效果m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle()|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_TWOCLICKACTIVATE);把這些代碼放在BOOLCDataBaseODBCDIg::OnlnitDialog()函數(shù)的return前,運(yùn)行就有相應(yīng)的效果。在頭文件DataBaseODBCDlg.h中添加#include"afxdb.h""afxdb.h"即MFC的ODBC類包括以下要用到的類:CDatabase類:主要功能是建立與數(shù)據(jù)源的連接。CRecordset類:該類代表從數(shù)據(jù)源選擇的一組記錄(記錄集),程序可以選擇數(shù)據(jù)源中的某個(gè)表作為一個(gè)記錄集,也可以通過對表的查詢得到記錄集,還可以合并同一數(shù)據(jù)源中多個(gè)表的列到一個(gè)記錄集中.通過該類可對記錄集中的記錄進(jìn)行滾動(dòng)、修改、增加和刪除等操作。CDBException類:代表ODBC類產(chǎn)生的異常。概括地講,CDatabase針對某個(gè)數(shù)據(jù)庫,它負(fù)責(zé)連接數(shù)據(jù)源;CRecordset針對數(shù)據(jù)源中的記錄集,它負(fù)責(zé)對記錄的操作。在頭文件中添加一些定義,其中CDBVariant對象表示用于MFCODBC類的可變數(shù)據(jù)類型。private:CDatabasem_db;public://將CDBVariant轉(zhuǎn)化成字符串CStringVariantToCString(CDBVariant*var);為了方便,我就不添加新的按鈕,雙擊對話框的“確定”按鈕,進(jìn)入函數(shù),注釋掉里面的OnOK函數(shù),添加如下代碼://連接數(shù)據(jù)庫,打開數(shù)據(jù)源,這里的DSN就是之前在ODBC中設(shè)置的DSNif(!m_db.IsOpen()&&!m_db.OpenEx(_T("DSN=db27;UID=user277;PWD=user277"),CDatabase::openReadOnly|CDatabase::noOdbcDialog)){MessageBox(L"連接錯(cuò)誤!”);return;}//CRecordset類:代表從數(shù)據(jù)源選擇一組記錄(記錄集)CRecordsetm_set(&m_db);//Open方法打開記錄集m_set.Open(CRecordset::forwardOnly,_T("SELECT*frombook"),CRecordset::readOnly);CDBVariantvar;//記錄有數(shù)據(jù)的類型和數(shù)據(jù)的值,它封閉了VARIANT數(shù)據(jù)類型m_ListCtrl.DeleteAllltems();〃刪除所有的項(xiàng)目shortnFields=m_set.GetODBCFieldCount();〃得到列的數(shù)目inti=0;〃添加所有內(nèi)容到控件while(!m_set.IsEOF()){for(shortindex=0;index<nFields;index++){m_set.GetFieldValue(index,var);//dosomethingwithvarValue〃添加一行記錄if(index==0)m_ListCtrl.InsertItem(i,VariantToCString(&var));〃繼續(xù)增加記錄的其他項(xiàng)elsem_ListCtrl.SetItemText(i,index,VariantToCString(&var));}m_set.MoveNext();i++;}m_set.Close();//凡打開m_db.Close();//皆關(guān)閉VariantToCSting函數(shù)將CDBVariantX寸象轉(zhuǎn)成CString,用以顯示。CStringCDataBaseODBCDlg::VariantToCString(CDBVariant*var){CStringstr;//轉(zhuǎn)換以后的字符串if(!var){str="NULLVarParameter";returnstr;}switch(var->m_dwType){caseDBVT_SHORT:str.Format(L"%d",(int)var->m」Val);break;caseDBVT_LONG:str.Format(L"%d",var->m_IVal);break;caseDBVT_SINGLE:str.Format(L"%10.6f",(double)var->m_fltVal);break;caseDBVT_DOUBLE:str.Format(L"%10.6f",var->m_dblVal);break;caseDBVT_BOOL:str=(var->m_boolVal==0)?L"FALSE":L"TRUE";break;caseDBVT_STRING:str=var->m_pstring->GetBuffer();break;caseDBVT_ASTRING:str=var->m_pstringA->GetBuffer();break;caseDBVT_WSTRING:str=var->m_pstringW->GetBuffer();break;caseDBVT_DATE:str.Format(L"%d-%d-%d",(var->m_pdate)->year,(var->m_pdate)->month,(var->m_pdate)->day);break;default:str.Format(L"Unktype%d\n",var->m_dwType);TRACE(L"Unknowntype%d\n",var->m_dwType);}returnstr;}根據(jù)CDBVariant里的m_dwType屬性可以知道里面的內(nèi)容是什么類型的,然后對應(yīng)的顯示就OK了,其中DBVT_DATA屬性可以根據(jù)需要自己更改格式。至此,運(yùn)行程序,點(diǎn)擊“確定”按鈕就能看到圖示結(jié)果,可以完成查詢工作了。
書號(hào)類別書名出版社出版…作者價(jià)格總藏??"目刖??“12341...數(shù)據(jù)…數(shù)據(jù)…濟(jì)華…1998王珊27.903012342...埶據(jù)…埶據(jù)…濟(jì)華…1998王珊27.903012345...數(shù)據(jù)…數(shù)據(jù)…濟(jì)華…1998王珊27.903014345...數(shù)據(jù)…數(shù)據(jù)…濟(jì)華…1998王珊27.9030島DataBaseODBC確定 取消不妨再添加一個(gè)“button”控件用以添加記錄,從工具集中拖一個(gè)button控件,雙擊標(biāo)記代碼:voidCDataBaseODBCDIg::OnBnClickedBtnadd(){//TODO:在此添加控件通知處理程序代碼if(!m_db.lsOpen()&&!m_db.OpenEx(_T("DSN=db27;UID=user277;PWD=user277"),CDatabase::openReadOnIy|CDatabase::noOdbcDialog)){MessageBox(L"連接錯(cuò)誤!”);return;}try{m_db.ExecuteSQL(_T("INSERTINTObookVALUES")_T("('87654321','其他','其他1','浙江大學(xué)出版社',1984,'韓寒',12.9,4,2)"));}catch(CDBException*pe){//Theerrorcodeisinpe->m_nRetCodepe->ReportError();pe->Delete();}mdb.Close();
書號(hào)類別書名出版社出版…作者價(jià)格總藏"""目刖…12341...數(shù)據(jù)…數(shù)據(jù)…濟(jì)華…1998王珊27.903012342...數(shù)據(jù)…數(shù)據(jù)…濟(jì)華…1998王珊27.903012345...數(shù)據(jù)…數(shù)據(jù)…濟(jì)華…1998王珊27.903014345...數(shù)據(jù)…數(shù)據(jù)…濟(jì)華…1998王珊27.903087&54...其他…其他1浙江…1984韓寒12.90斗2島DataBaseODBC増加 確定 取消運(yùn)行后,點(diǎn)擊新添加的按鈕可以增加一條記錄。再添加一個(gè)可以實(shí)現(xiàn)刪除的button,雙擊之后添加代碼如下。運(yùn)行后,點(diǎn)擊新添加的按鈕可以增加一條記錄。POSITIONpos=m_ListCtrl.GetFirstSelectedltemPosition();if(pos==NULL){TRACE(_T("Noitemswereselected!'"'));}else{while(pos){〃得到選中的itemintnltem=m_ListCtrl.GetNextSelectedItem(pos);TRACE(_T("Item
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五美容院員工培訓(xùn)課程開發(fā)與實(shí)施合同4篇
- 二零二五年度農(nóng)業(yè)土地租賃合同稅收籌劃策略4篇
- 二零二五年度特種門類安裝及售后服務(wù)合同3篇
- 房贈(zèng)予合同范本(2篇)
- 二零二五年度出租車庫信息化改造合同4篇
- 2025年度牛奶產(chǎn)業(yè)鏈上下游合作合同4篇
- 2025年度健康養(yǎng)生經(jīng)營承包合同樣本3篇
- 2025版歷史文化名城美化保護(hù)合同
- 二零二五年度教育機(jī)構(gòu)教師聘用合同樣本4篇
- 二零二五年度勞動(dòng)合同對價(jià)與員工多元化福利方案合同2篇
- 2023年成都市青白江區(qū)村(社區(qū))“兩委”后備人才考試真題
- 2024中考復(fù)習(xí)必背初中英語單詞詞匯表(蘇教譯林版)
- 海員的營養(yǎng)-1315醫(yī)學(xué)營養(yǎng)霍建穎等講解
- 《現(xiàn)代根管治療術(shù)》課件
- 肩袖損傷的護(hù)理查房課件
- 2023屆北京市順義區(qū)高三二模數(shù)學(xué)試卷
- 公司差旅費(fèi)報(bào)銷單
- 我國全科醫(yī)生培訓(xùn)模式
- 2021年上海市楊浦區(qū)初三一模語文試卷及參考答案(精校word打印版)
- 八年級上冊英語完形填空、閱讀理解100題含參考答案
- 八年級物理下冊功率課件
評論
0/150
提交評論