




已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
VC學(xué)生成績管理系統(tǒng)1. VC操作數(shù)據(jù)庫簡介本章節(jié)主要介紹VC中操作數(shù)據(jù)庫的一般方法,有ADO Data控件的連接、ADODB對(duì)象的使用,當(dāng)然在可視化的開發(fā)系統(tǒng)中用控件是的方法是比較簡單的,但不是很靈活,相比較ADODB對(duì)象的方法比較靈活,但使用相對(duì)麻煩;這里讀者會(huì)問,那這兩個(gè)又是怎么去訪問到數(shù)據(jù)庫的呢?其實(shí)他們是通過一些接口去訪問不同數(shù)據(jù)庫的,而這些接口會(huì)屏蔽掉數(shù)據(jù)庫訪問協(xié)議和各個(gè)數(shù)據(jù)庫之間的差別,這里最常用的有兩種接口,一種就是ODBC、還有一種是OLE DB,下面我們介紹他們的結(jié)構(gòu):(a)數(shù)據(jù)庫訪問接口:(1) ODBC:ODBC其實(shí)是開放式數(shù)據(jù)庫互連(Open Database Connectivity),是微軟公司推出的一種實(shí)現(xiàn)應(yīng)用程序和關(guān)系數(shù)據(jù)庫之間通訊的方法標(biāo)準(zhǔn),是一個(gè)接口標(biāo)準(zhǔn)。所以它實(shí)際上是一種標(biāo)準(zhǔn),符合標(biāo)準(zhǔn)的數(shù)據(jù)庫就可以通過SQL語言編寫的命令對(duì)數(shù)據(jù)庫進(jìn)行操作,但只能針對(duì)關(guān)系數(shù)據(jù)庫進(jìn)行操作(如SQL Server,Oracle,Access,Excel等),目前所有的關(guān)系數(shù)據(jù)庫都符合該標(biāo)準(zhǔn)。ODBC本質(zhì)上是一組數(shù)據(jù)庫訪問API(應(yīng)用程序編程接口),由一組函數(shù)調(diào)用組成,核心是SQL語句,他的結(jié)構(gòu)圖如下圖1:圖 1.1在具體操作時(shí),首先必須用ODBC管理器注冊(cè)一個(gè)數(shù)據(jù)源,管理器根據(jù)數(shù)據(jù)源提供的數(shù)據(jù)庫位置、數(shù)據(jù)庫類型及ODBC驅(qū)動(dòng)程序等信息,建立起ODBC與具體數(shù)據(jù)庫的聯(lián)系。這樣,只要應(yīng)用程序?qū)?shù)據(jù)源名提供給ODBC,ODBC就能建立起與相應(yīng)數(shù)據(jù)庫的連接。(2) OLE DB:OLE DB:數(shù)據(jù)庫鏈接和嵌入對(duì)象(Object Linking and Embedding DataBase)。OLE DB是微軟提出的基于COM思想且面向?qū)ο蟮囊环N技術(shù)標(biāo)準(zhǔn),目的是提供一種統(tǒng)一的數(shù)據(jù)訪問接口訪問各種數(shù)據(jù)源,這里所說的數(shù)據(jù)除了標(biāo)準(zhǔn)的關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)之外,還包括郵件數(shù)據(jù)、Web上的文本或圖形、目錄服務(wù)(Directory Services)、以及主機(jī)系統(tǒng)中的文件和地理數(shù)據(jù)以及自定義業(yè)務(wù)對(duì)象等。OLE DB標(biāo)準(zhǔn)的核心內(nèi)容就是要求對(duì)以上這些各種各樣的數(shù)據(jù)存儲(chǔ)(Data Store)都提供一種相同的訪問接口,使得數(shù)據(jù)的使用者(應(yīng)用程序)可以使用同樣的方法訪問各種數(shù)據(jù),而不用考慮數(shù)據(jù)的具體存儲(chǔ)地點(diǎn)、格式或類型,他的結(jié)構(gòu)圖如下圖2:圖 1.2(b)VC中數(shù)據(jù)庫訪問對(duì)象:(1) ADO Data控件:ADO Data 控件使用 Microsoft ActiveX 數(shù)據(jù)對(duì)象(ADO) 來快速建立數(shù)據(jù)綁定的控件和數(shù)據(jù)提供者之間的連接。數(shù)據(jù)綁定控件是任何具有“數(shù)據(jù)源”屬性的控件。數(shù)據(jù)提供者可以是任何符合 OLEDB 規(guī)范的數(shù)據(jù)源,這里可能是對(duì)ADO的一個(gè)封裝,他訪問數(shù)據(jù)庫的接口可以使用ODBC、也可以使用OLEDB,但OLEDB靈活,不用在系統(tǒng)中配置數(shù)據(jù)源,而且效率高,所以現(xiàn)在使用OLEDB更多點(diǎn),下面程序中也是用OLEDB來介紹的,這里簡單介紹一下ADODC控件的使用層次圖。ADODC在VC數(shù)據(jù)庫程序設(shè)計(jì)中起了一個(gè)橋梁的作用,可以方便VC中的一些控件直接和數(shù)據(jù)庫關(guān)聯(lián),他的使用示意圖如下: 圖 1.3(2) ADODB對(duì)象ADO是ActiveX Data Objects的縮寫,是一項(xiàng)新的數(shù)據(jù)庫的存取技術(shù),他最主要包含三個(gè)對(duì)象,Connection、Recordset、Command,Connection對(duì)象:連接對(duì)象,負(fù)責(zé)通過OLEDB或ODBC建立與數(shù)據(jù)庫之間的連接。Recordset對(duì)象:記錄集對(duì)象,存放從數(shù)據(jù)庫中得到的記錄,這些可能是執(zhí)行某條SQL語句的結(jié)果。Command對(duì)象:執(zhí)行SQL語句返回Recordset類型的結(jié)果。基本的用法:(1) 連接數(shù)據(jù)源(2) 打開記錄集對(duì)象(3) 使用記錄集(4) 斷開連接具體的應(yīng)用后面在學(xué)生成績錄入中會(huì)介紹到。2. VC連接SQL Server數(shù)據(jù)庫a) 用可視ADODC控件連接數(shù)據(jù)庫,從ProjectAdd To ProjectComponents And Controls,如圖將ADO、DBGird組控件選擇到工具欄。(1) 設(shè)置ADODC的ConnectionString屬性。選擇組件控件圖 2.1 (2)打開ADO的屬性頁,選擇Control下的生成連接字符串。生成連接字符串點(diǎn)擊打開屬性頁圖 2.2圖 2.3圖 2.4(3)設(shè)置ADO Data Control的RecordSource屬性。命令類型圖 2.5 命令類型:adCmdText :值1,表示命令為SQL語句。adCmdTable :值2,表示命令為一表名。adCmdStoredProc:值4,表示命令是一存儲(chǔ)過程名。adCmdUnknown :值8,表示不確定命令類型。(4)此時(shí)數(shù)據(jù)源控件已連接好數(shù)據(jù)庫,可以直接訪問它,或者可以充當(dāng)數(shù)據(jù)表格控件的數(shù)據(jù)源使用。b) 用Connection對(duì)象連接數(shù)和操作據(jù)庫(1) 創(chuàng)建Connection對(duì)象_ConnectionPtr pConnection = NULL;pConnection.CreateInstance(_uuidof(Connection);(2) 使用Connection對(duì)象HRESULT hr;_bstr_t strCnn(Provider=SQLOLEDB;Server=microsof-cee903dcr;DataBase=XSCJ;UID=wmx;PWD=1234;);/ “SQLOLEDB”使用OLEDB, “microsof-cee903dcr”SQL數(shù)據(jù)庫服務(wù)器名,”XSCJ”數(shù)據(jù)庫名,后面是用戶明和密碼hr = pConnection-Open(strCnn,NULL);(3) Command對(duì)象用來執(zhí)行SQL語句來操作數(shù)據(jù)庫的對(duì)象,根據(jù)參數(shù)的不同可以執(zhí)行存儲(chǔ)過程_CommandPtr pCmd = NULL;/定義command 對(duì)象指針_ParameterPtr pParam = NULL;_RecordsetPtr pRs = NULL;CString SqlStr;pCmd.CreateInstance(_uuidof(Command);pCmd-ActiveConnection = pConnection;/執(zhí)行SQL語句SqlStr.Format(Select * from KC);pCmd-CommandText = (_bstr_t)SqlStr;pRs = pCmd-Execute(&vNULL,&vNULL,adCmdText);/返回記錄集/執(zhí)行存儲(chǔ)過程SqlStr.Format(AddStuScore);pCmd-CommandText = (_bstr_t)SqlStr;pCmd-CommandType = adCmdStoredProc;/為存儲(chǔ)過程創(chuàng)建輸入?yún)?shù)pParam = pCmd-CreateParameter(XH,adVarChar,adParamInput,16);pParam-Value = _variant_t(“”);pCmd-Parameters-Append(pParam);/為存儲(chǔ)過程創(chuàng)建輸入?yún)?shù)pParam = pCmd-CreateParameter(KCM,adVarChar,adParamInput,16);pParam-Value = _variant_t(“計(jì)算機(jī)基礎(chǔ)”);pCmd-Parameters-Append(pParam);/為存儲(chǔ)過程創(chuàng)建輸入?yún)?shù)pParam = pCmd-CreateParameter(CJ,adInteger,adParamInput,4);pParam-Value = _variant_t(long)80);pCmd-Parameters-Append(pParam);/為存儲(chǔ)過程創(chuàng)建輸入?yún)?shù)pParam = pCmd-CreateParameter(XF,adInteger,adParamInput,4);pParam-Value = _variant_t(long)0);pCmd-Parameters-Append(pParam);/執(zhí)行存儲(chǔ)過程pCmd-Execute(&vNULL,&vNULL,adCmdStoredProc);/關(guān)閉連接pConnection-Close();(4) Recordset對(duì)象用來操作表的更新刪除等的對(duì)象_RecordsetPtr pRs = NULL;CString SqlStr;pRs.CreateInstance(_uuidof(Recordset);SqlStr.Format(select * from XS where XH = %s,”);/打開記錄集pRs-Open(_variant_t(SqlStr),_variant_t(IDispatch *) pConnection,true),adOpenKeyset,adLockOptimistic,adCmdText);if(!pRs-adoEOF)pRs-PutCollect(CSSJ, _variant_t(DATE)”1991-2-5”);/更新記錄集pRs-Update();pRs-Close();pConnection-Close();3. 學(xué)生成績管理系統(tǒng)本演示系統(tǒng)是一個(gè)用VC實(shí)現(xiàn)的簡單的學(xué)生成績管理系統(tǒng),使用用可視ADODC控件和ADODB對(duì)象來訪問后臺(tái)數(shù)據(jù)庫服務(wù)器的,包含學(xué)生信息的查詢、學(xué)生休息的錄入修改刪除、學(xué)生成績的錄入修改,下面就分別說明各模塊的具體實(shí)現(xiàn)。4. 系統(tǒng)主界面創(chuàng)建XSCJ多文檔MFC工程,會(huì)生成框架,MainFrm、XSCJDoc、XSCJView等對(duì)象,這里演示的程序比較簡單,所以代碼主要加在XSCJView對(duì)象里,創(chuàng)建兩個(gè)Dialog來實(shí)現(xiàn)學(xué)生信息修改和學(xué)生成績修改。主界面菜單和工具條框架如下:菜單工具條圖 4.1主要功能:主界面,導(dǎo)航作用,點(diǎn)擊可進(jìn)入操作窗口。創(chuàng)建過程:(1) 創(chuàng)建菜單: 圖 4.2因?yàn)閷W(xué)生信息查詢作為默認(rèn)的界面,所以創(chuàng)建學(xué)生信息修改、學(xué)生成績修改,打開VC的ClassWizad,添加菜單處理事件,這里選擇映射到View對(duì)象里面。圖 4.3(2) 創(chuàng)建工具條:學(xué)生信息修改、學(xué)生成績修改圖 4.4創(chuàng)建工具條,打開VC的ClassWizad,添加菜單處理事件,這里選擇映射到View對(duì)象里面。圖 4.5主要菜單代碼:菜單Click的處理過程在CXSCJView對(duì)象里面,對(duì)應(yīng)與CXSCJView.cpp文件學(xué)生信息修改菜單void CXSCJView:OnMenuitem32771() / TODO: Add your command handler code hereCStuInfoModify myStuInfoWin;myStuInfoWin.DoModal();學(xué)生成績錄入菜單void CXSCJView:OnMenuitem32772() / TODO: Add your command handler code hereCStuAddScore myStuAddScoreWin;myStuAddScoreWin.DoModal();工具條Click的處理,分別對(duì)應(yīng)調(diào)用菜單中的處理過程學(xué)生信息修改工具條Click的處理void CXSCJView:OnButton32773() / TODO: Add your command handler code hereCStuInfoModify myStuInfoWin;myStuInfoWin.DoModal();成績錄入工具條Click的處理void CXSCJView:OnButton32774() / TODO: Add your command handler code hereCStuAddScore myStuAddScoreWin;myStuAddScoreWin.DoModal();5. 學(xué)生信息查詢目的與要求:了解使用控件顯示用SQL語句查詢到的數(shù)據(jù)庫中的數(shù)據(jù),同時(shí)了解模糊查詢的基本方法。程序界面:DataGrid控件ADODC控件學(xué)生選課表 圖 5.1主要功能:實(shí)現(xiàn)簡單查詢的需要,輸入條件進(jìn)行模糊查詢,各條件之間為與的關(guān)系,在查詢的結(jié)果中移動(dòng)記錄指針可以查看這個(gè)學(xué)生的具體選課信息創(chuàng)建過程:(1) 在View的主窗體IDD_XSCJ_FORM上放入兩個(gè)學(xué)生信息查詢的ADODC和學(xué)生選課信息的ADODC、創(chuàng)建兩個(gè)學(xué)生信息顯示的DataGrid和學(xué)生選課信息顯示的DataGrid,并分別起名為IDC_STUVIEWADODC, IDC_StuKCADO, IDC_STUVIEWDATAGRID,IDC_DGKC。放入IDC_StuXH學(xué)號(hào)Edit、IDC_StuXM姓名Edit和IDC_StuZYCB專業(yè)下拉列表框,為了美觀IDC_StuKCADO隱藏在IDC_DGKC后面,增加IDC_StuZYCB專業(yè)下拉列表項(xiàng),如圖5.2。圖 5.2(2) 設(shè)置IDC_STUVIEWADODC, IDC_StuKCADO的ConnectionString屬性為Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=XSCJ;Data Source=microsof-cee903dcr(3) 設(shè)置IDC_STUVIEWADODC的RecordSource屬性為select * from XS,CXB where XS.XB=CXB.XB(4) 設(shè)置IDC_STUVIEWDATAGRID的DataSource屬性為IDC_STUVIEWADODC。(5) 設(shè)置IDC_StuKCADO的ConnectionString屬性為Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=XSCJ;Data Source=microsof-cee903dcr(6) 設(shè)置IDC_StuKCADO的RecordSource屬性為select * from XS,KC,XS_KCwhere XS.XH=XS_KC.XH and KC.KCH=XS_KC.KCH(7) 設(shè)置IDC_DGKC的DataSource屬性為IDC_StuKCADO。(8) 使用ClassWizad對(duì)這些控件設(shè)定變量的綁定,選頂綁定的類型,Edit只要輸入輸出,所以簡單的CString類型就可以滿足,ADO則要選擇CAdodc的變量類型,這樣才能訪問其屬性和調(diào)用函數(shù),如圖5.3、5.4。圖 5.3圖 5.4完成的開發(fā)窗體如圖:圖 5.5實(shí)現(xiàn)過程:直接打開時(shí)由于控件屬性的設(shè)置,所以顯示所有記錄,當(dāng)輸入查詢條件時(shí)點(diǎn)擊查詢按鈕則調(diào)用MakeSqlStr函數(shù)產(chǎn)生查詢字符串,然后重新設(shè)置控件的屬性,打開控件顯示查詢結(jié)果集。當(dāng)查詢結(jié)果學(xué)生信息記錄集中移動(dòng)記錄指針時(shí),可以在下面的選課表中看到學(xué)生選課的信息。主要代碼:CXSCJView對(duì)象的構(gòu)造函數(shù),為了避免在未初始化完成就做一些操作,所以定義m_AdoInitFlag為初始化完成標(biāo)記,標(biāo)記有效才能做進(jìn)一步操作。class CXSCJView : public COleDBRecordViewpublic:int m_AdoInitFlag;/添加成員變量CXSCJView類的構(gòu)造函數(shù),初始化成員對(duì)象CXSCJView:CXSCJView(): COleDBRecordView(CXSCJView:IDD)/AFX_DATA_INIT(CXSCJView)m_pSet = NULL;m_StuXH = _T();m_StuXM = _T();m_AdoInitFlag = 0;/初始化成0/AFX_DATA_INIT/ TODO: add construction code hereCXSCJView初始化函數(shù),這里初始化IDC_STUVIEWDATAGRID的顯示格式,添加表格頭以及和數(shù)據(jù)庫字段的綁定關(guān)系。void CXSCJView:OnInitialUpdate()m_pSet = &GetDocument()-m_xSCJSet;COleDBRecordView:OnInitialUpdate();CColumns cols; CColumn col;VARIANT vIndex;/ TODO: Add extra initialization here/增加表格列cols = m_ViewDBGrid.GetColumns();cols.Add(2);cols.Add(3);cols.Add(4);cols.Add(5);cols.Add(6);vIndex.vt = VT_UINT;/分別設(shè)定每列的屬性,包括表頭、綁定的數(shù)據(jù)庫字段vIndex.uintVal = long(0);col=cols.GetItem(vIndex);col.SetDataField(XH);col.SetCaption(學(xué)號(hào));vIndex.uintVal = long(1);col=cols.GetItem(vIndex);col.SetDataField(XM);col.SetCaption(姓名);vIndex.uintVal = long(2);col=cols.GetItem(vIndex);col.SetDataField(XBM);col.SetCaption(性別);vIndex.uintVal = long(3);col=cols.GetItem(vIndex);col.SetDataField(CSSJ);col.SetCaption(出生日期);vIndex.uintVal = long(4);col=cols.GetItem(vIndex);col.SetDataField(ZY);col.SetCaption(專業(yè));vIndex.uintVal = long(5);col=cols.GetItem(vIndex);col.SetDataField(ZXF);col.SetCaption(總學(xué)分);vIndex.uintVal = long(6);col=cols.GetItem(vIndex);col.SetDataField(BZ);col.SetCaption(備注);/初始化標(biāo)記設(shè)置m_AdoInitFlag = 1;m_ViewDBGrid.ReBind();m_ViewDBGrid.Refresh();m_StuViewAdodc.GetRecordset().MoveFirst();根據(jù)輸入產(chǎn)生查詢SQL語句的函數(shù),以學(xué)號(hào)、姓名的輸入信息和專業(yè)的選擇生成模糊查詢的SQL字符串CString CXSCJView:MakeSqlStr(void)CString SqlStr;CString TempStr;UpdateData(TRUE);if(!m_StuXH.IsEmpty()SqlStr += and XH like %;SqlStr += m_StuXH;SqlStr += % ;if(!m_StuXM.IsEmpty()/strcat(SqlStr,and XH like );SqlStr += and XM like %;SqlStr += m_StuXM;SqlStr += % ;/取選擇的專業(yè)int index = m_StuZYCB.GetCurSel();m_StuZYCB.GetLBText(index,TempStr);TempStr.TrimRight();if(!TempStr.IsEmpty()SqlStr += and ZY = ;SqlStr += TempStr;SqlStr += ;return SqlStr;“查詢”Click事件處理,用生成的模糊查詢的SQL字符串,來刷新IDC_STUVIEWADODC,并顯示到關(guān)聯(lián)的DataGrid中,在DataGrid顯示查詢到的結(jié)果void CXSCJView:OnSearchb() / TODO: Add your control notification handler code hereCString SqlStr;SqlStr = select * from XS,CXB where XS.XB=CXB.XB + MakeSqlStr();m_StuViewAdodc.SetRecordSource(SqlStr);m_StuViewAdodc.Refresh();IDC_STUVIEWADODC控件有記錄Move的消息的時(shí)候,以當(dāng)前學(xué)生信息的學(xué)號(hào)作為查詢條件,從XS_KC表中查找當(dāng)前學(xué)生的選課記錄,并顯示到學(xué)生課程顯示的IDC_DGKC中void CXSCJView:OnMoveCompleteStuviewadodc(long adReason, LPDISPATCH pError, long FAR* adStatus, LPDISPATCH pRecordset) / TODO: Add your control notification handler code hereif(m_AdoInitFlag = 0)return;_RecordsetPtr pRs;_variant_t varFld;CString SqlStr; pRs.CreateInstance(_uuidof(Recordset); pRecordset-QueryInterface(IID_IDispatch, (void *)&pRs);varFld = pRs-Fields-GetItem(XH)-Value;CString strXH(_T(varFld.bstrVal);strXH.TrimRight();SqlStr.Format(select XM,KCM,CJ,KC.XF from XS,KC,XS_KC Where XS.XH = XS_KC.XH And KC.KCH = XS_KC.KCH and XS.XH=%s,strXH);m_StuKCADO.SetRecordSource(SqlStr);m_StuKCADO.Refresh();注:為了方便控件顯示學(xué)生性別,這里建立了一個(gè)表CXB(XB bit,XBM varchar(4))存放數(shù)據(jù)1,男;0,女,這樣把要顯示的表與其連接便可以顯示中文的性別,如有類似情況可參照此方法。6. 學(xué)生信息修改目的與要求:了解使用Recordset對(duì)象對(duì)數(shù)據(jù)庫操作的基本方法(增、刪、改),以及存儲(chǔ)顯示圖像的操作。程序界面:圖 6.1主要功能:用戶可以點(diǎn)擊下面的DataGrid表格,移動(dòng)記錄指針,用戶資料便同步映到上面的控件中去,修改控件中的信息,點(diǎn)擊“更新”實(shí)現(xiàn)修改。如輸入一個(gè)新的學(xué)號(hào)點(diǎn)擊“更新”實(shí)現(xiàn)記錄的添加,當(dāng)選中當(dāng)前記錄點(diǎn)擊“刪除”時(shí)則可以刪除此學(xué)生記錄,點(diǎn)擊“載入照片”可以選擇學(xué)生照片,用于更新學(xué)生照片信息。創(chuàng)建過程:(1)在IDD_STU_INFO窗體上放入ADODC、DataGrid并起名為IDC_ADODC2, IDC_DATAGRID2。(2)設(shè)置StuADO的ConnectionString屬性為Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=XSCJ;Data Source=microsof-cee903dcr(3)置IDC_ADODC2的RecordSource屬性為select * from XS,CXB where XS.XB=CXB.XB(4)置IDC_DATAGRID2的DataSource屬性為IDC_ADODC2。(5)在窗體上放入Image控件并起名為IDC_STUPIC,用來顯示學(xué)生照片。(6)并在窗體上放入如圖所需控件,并在ClassWizad定義關(guān)聯(lián)變量,如圖6.2。圖 6.2設(shè)計(jì)好的窗體如圖:圖 6.3實(shí)現(xiàn)過程:當(dāng)點(diǎn)擊DataGrid中的記錄時(shí)記錄集游標(biāo)也跟著移動(dòng),在OnMoveCompleteAdodc2事件中取出本條記錄顯示在上面的控件中,可以在控件中修改學(xué)生信息,點(diǎn)擊載入照片可以選擇學(xué)生照片,按更新按鈕更新到數(shù)據(jù)庫中,按刪除按鈕刪除當(dāng)前此記錄,刪除記錄時(shí)系統(tǒng)會(huì)調(diào)用CheckXs觸發(fā)器來保持?jǐn)?shù)據(jù)的參照完整性。主要代碼:CStuInfoModify 類中定義的全局變量class CStuInfoModify : public CDialog/ Constructionpublic:int m_InitCompleteFlags; /初始化標(biāo)記CString m_StuZPPath;/照片路徑IStream *m_pStuZPStm; /照片流變量longm_StuZPLen; /照片長度char * m_pStuZPBuf;/照片緩沖指針_variant_t m_varChunk;/可變類型,用來從COM接口中獲取數(shù)據(jù)CStuInfoModify類構(gòu)造函數(shù)CStuInfoModify:CStuInfoModify(CWnd* pParent /*=NULL*/): CDialog(CStuInfoModify:IDD, pParent)/AFX_DATA_INIT(CStuInfoModify)m_StuXH = _T();m_StuXM = _T();m_StuZXF = 0;m_StuBZ = _T();m_StuCSSJ = COleDateTime:GetCurrentTime();m_StuXBN = -1;/AFX_DATA_INITthis-m_InitCompleteFlags = 0;m_pStuZPStm = NULL;窗口初始化函數(shù),定義IDC_DATAGRID2的顯示風(fēng)格,添加表格頭以及和數(shù)據(jù)庫字段的綁定關(guān)系。BOOL CStuInfoModify:OnInitDialog() CDialog:OnInitDialog();CColumns cols; CColumn col;VARIANT vIndex;/ TODO: Add extra initialization herecols = m_StuIMDBGrid.GetColumns();cols.Add(2);cols.Add(3);cols.Add(4);cols.Add(5);cols.Add(6);vIndex.vt = VT_UINT;vIndex.uintVal = long(0);col=cols.GetItem(vIndex);col.SetDataField(XH);col.SetCaption(學(xué)號(hào));vIndex.uintVal = long(1);col=cols.GetItem(vIndex);col.SetDataField(XM);col.SetCaption(姓名);vIndex.uintVal = long(2);col=cols.GetItem(vIndex);col.SetDataField(XBM);col.SetCaption(性別);vIndex.uintVal = long(3);col=cols.GetItem(vIndex);col.SetDataField(CSSJ);col.SetCaption(出生日期);vIndex.uintVal = long(4);col=cols.GetItem(vIndex);col.SetDataField(ZY);col.SetCaption(專業(yè));vIndex.uintVal = long(5);col=cols.GetItem(vIndex);col.SetDataField(ZXF);col.SetCaption(總學(xué)分);vIndex.uintVal = long(6);col=cols.GetItem(vIndex);col.SetDataField(BZ);col.SetCaption(備注);m_StuIMDBGrid.ReBind();m_StuIMDBGrid.Refresh();/添加專業(yè)項(xiàng)m_StuZY.InsertString(0,計(jì)算機(jī));m_StuZY.InsertString(1,通信工程);/ TODO: Add extra initialization here/初始化完成標(biāo)記m_InitCompleteFlags = 1;/移動(dòng)記錄指針到第一個(gè)m_StuADO.GetRecordset().MoveFirst();/重繪窗口消息:PostMessage(this-GetSafeHwnd(),WM_PAINT,0,0);return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE學(xué)生信息記錄集記錄指針移動(dòng)完成事件,取出當(dāng)前記錄中的學(xué)生信息,更新到學(xué)號(hào)、姓名等顯示控件中去,從ADO中取出學(xué)生照片,并以流的方式保存,調(diào)用重繪,在OnPaint中顯示照片void CStuInfoModify:OnMoveCompleteAdodc2(long adReason, LPDISPATCH pError, long FAR* adStatus, LPDISPATCH pRecordset) /窗口初始化判斷if(m_InitCompleteFlags = 0)return;_RecordsetPtr pRsZP = NULL;_ConnectionPtr pConnection = NULL;HRESULT hr;_RecordsetPtr pRs;_variant_t varFld; pRs.CreateInstance(_uuidof(Recordset); pRecordset-QueryInterface(IID_IDispatch, (void *)&pRs);varFld = pRs-Fields-GetItem(XH)-Value;CString strXH(_T(varFld.bstrVal);strXH.TrimRight();m_StuXH = strXH;varFld = pRs-Fields-GetItem(XM)-Value;CString strXM(_T(varFld.bstrVal);strXM.TrimRight();m_StuXM = strXM;varFld = pRs-Fields-GetItem(BZ)-Value;CString strBZ(_T(varFld.bstrVal);strBZ.TrimRight();m_StuBZ = strBZ;varFld = pRs-Fields-GetItem(CSSJ)-Value;m_StuCSSJ = varFld.date;varFld = pRs-Fields-GetItem(ZXF)-Value;m_StuZXF = varFVal;varFld = pRs-Fields-GetItem(ZY)-Value;CString str(_T(varFld.bstrVal);str.TrimRight();/remove place on leftint index = m_StuZY.FindStringExact(0,(LPCTSTR)str);m_StuZY.SetCurSel(index);varFld = pRs-Fields-GetItem(XB)-Value;if(varFld.boolVal)m_StuXBN = 0;elsem_StuXBN = 1;/根據(jù)當(dāng)前學(xué)號(hào),從數(shù)據(jù)庫中讀出照片數(shù)據(jù)流,并保存在m_pStuZPStm流中,在OnPaint中會(huì)把他顯示出來_bstr_t strCnn(SQLCONSTR);try_StreamPtr pStream = NULL; CString Sql;pStream.CreateInstance(_uuidof(Stream); variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR); pStream-PutType(adTypeBinary); pStream-Open(varOptional, adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t(); /打開連接,提取學(xué)生照片Sql.Format(Select ZP from XS where XH = %s,strXH);pConnection.CreateInstance(_uuidof(Connection);hr = pConnection-Open(strCnn,NULL);pRsZP.CreateInstance(_uuidof(Recordset);pRsZP-Open(_bstr_t)Sql,_variant_t(IDispatch *) pConnection,true),adOpenKeyset,adLockOptimistic,adCmdText);/取照片數(shù)據(jù)長度long lDataLength = pRsZP-Fields-GetItem(ZP)-ActualSize;if(lDataLength = 0)m_varChunk.Clear();else/取照片數(shù)據(jù)m_varChunk = pRsZP-Fields-GetItem(ZP)-GetChunk(lDataLength);if(m_varChunk.vt = (VT_ARRAY | VT_UI1)/復(fù)制照片數(shù)據(jù)到流中SafeArrayAccessData(m_varChunk.parray,(void *)&m_pStuZPBuf);HRESULT hr=CreateStreamOnHGlobal(m_pStuZPBuf,TRUE,&m_pStuZPStm);m_StuZPLen = lDataLength;SafeArrayUnaccessData (m_varChunk.parray);pRsZP-Close();pConnection-Close();catch(_com_error &e)/ Notify the user of errors if any._bstr_t bstrSource(e.Source();_bstr_t bstrDescription(e.Description();CString sError;sError.Format(Source : %s Description : %s ,(LPCSTR)bstrSource,(LPCSTR)bstrDescription);AfxMessageBox(sError);pRsZP-Close();pConnection-Close();/窗口重繪消息,顯示照片:PostMessage(this-GetSafeHwnd(),WM_PAINT,0,0);UpdateData(FALSE);“刪除”Click事件處理,取出當(dāng)前記錄的學(xué)號(hào),然后通過commad對(duì)象執(zhí)行delete語句來刪除當(dāng)前的學(xué)生記錄,Delete語句的調(diào)用會(huì)引起CheckXs觸發(fā)器的動(dòng)作void CStuInfoModify:OnDelete() / TODO: Add your control notification handler code here_ConnectionPtr pConnection = NULL;_CommandPtr pCmd = NULL;HRESULT hr;_variant_t vNULL; vNULL.vt = VT_ERROR; vNULL.scode = DISP_E_PARAMNOTFOUND;/定義為無參數(shù)_bstr_t strCnn(SQLCONSTR);try/Open a connectionUpdateData(TRUE);pConnection.CreateInstance(_uuidof(Connection);hr = pConnection-Open(strCnn,NULL);pCmd.CreateInstance(_uuidof(Command);pCmd-ActiveConnection = pConnection;CString SqlStr;SqlStr.Format(delete from XS where XH = %s,m_StuXH);pCmd-CommandText = (_bstr_t)SqlStr;pCmd-Execute(&vNULL,&vNULL,adCmdText);pConnection-Close();AfxMessageBox(刪除成功!);catch(_com_error &e)/ Notify the user of errors if any._bstr_t bstrSource(e.Sourc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年客服服務(wù)技巧與心理學(xué)知識(shí)試題及答案
- 商品代銷商合同協(xié)議
- 武漢市裝修合同補(bǔ)充協(xié)議
- 快遞員勞務(wù)派遣合同協(xié)議
- 向房東提出終止合同協(xié)議
- 員工安全責(zé)任協(xié)議合同協(xié)議
- 快遞經(jīng)營合作合同協(xié)議
- 商品房四方合同協(xié)議
- 售后維護(hù)協(xié)議書范本
- 商業(yè)保密協(xié)議合同協(xié)議
- 在線監(jiān)測運(yùn)維管理體系
- 英語課件 外研版(2019)選擇性必修四 Unit6 Developing ideas
- 產(chǎn)后抑郁癥的原因及護(hù)理文獻(xiàn)匯報(bào)
- 湖北省武漢市華中師大一附中2025屆高考數(shù)學(xué)全真模擬密押卷含解析
- 2024年司法考試完整真題及答案
- ARVR在電商設(shè)計(jì)中的應(yīng)用與前景
- 宣傳工作實(shí)務(wù)-形考任務(wù)三-國開(FJ)-參考資料
- 2023年上海鐵路局集團(tuán)有限公司招聘考試真題
- 軸類零件加工工藝設(shè)計(jì)-畢業(yè)設(shè)計(jì)論文
- 設(shè)備、材料供應(yīng)方案
- 電波流速儀測流規(guī)程DB41-T 2229-2022
評(píng)論
0/150
提交評(píng)論