2026/2/12 7:43:51
网站建设
项目流程
网站建设ps模板下载,网站建设与规划结课论文,wordpress 如果分类,100个免费推广网站VC Oracle 实现汽配管理系统
内容整理的 完整技术指南#xff0c;涵盖开发环境搭建、VC 与 Oracle 集成、核心语法知识点、自定义控件设计、数据库操作类封装及综合性案例。所有代码均附详细注释#xff0c;适用于 Visual C 6.0 / Visual Studio#xff08;建议 VS2019/20…VC Oracle 实现汽配管理系统内容整理的完整技术指南涵盖开发环境搭建、VC 与 Oracle 集成、核心语法知识点、自定义控件设计、数据库操作类封装及综合性案例。所有代码均附详细注释适用于 Visual C 6.0 / Visual Studio建议 VS2019/2022 Oracle 19c 开发场景。一、开发环境安装与配置1. 安装 Visual Studio推荐 VS2019 或 VS2022下载地址Visual Studio Community安装时勾选“使用 C 的桌面开发”工作负载。2. 安装 Oracle 数据库Oracle 19c XE下载地址Oracle Database XE安装后创建用户CREATEUSERauto_parts IDENTIFIEDBYap_password;GRANTCONNECT,RESOURCE,DBATOauto_parts;3. 安装 Oracle Instant Client用于 ODBC/OLE DB 连接下载地址Oracle Instant Client下载instantclient-basic-windows.x64.zip解压到C:\oracle\instantclient_19_20配置系统环境变量PATHC:\oracle\instantclient_19_20 TNS_ADMINC:\oracle\instantclient_19_204. 配置 ODBC 数据源DSN打开控制面板 → 管理工具 → ODBC 数据源(64位)在“系统 DSN”中点击“添加”选择Oracle in instantclient_19_20填写Data Source Name:AutoPartsDBTNS Service Name:XE或你的服务名User ID:auto_parts测试连接成功即可。✅ 此 DSN 将在 VC 中通过 ADO 使用。二、核心语法知识点与代码示例知识点 1VC 中使用 ADO 连接 OracleRxADO 类设计背景ADOActiveX Data Objects是 Windows 平台访问数据库的标准 COM 接口。通过#import引入 msado15.dll。步骤 1引入 ADO 库在 stdafx.h 中// stdafx.h#pragmaonce// 其他 MFC 头文件...// 引入 ADO 库智能指针#importC:\Program Files\Common Files\System\ado\msado15.dll\no_namespacerename(EOF,EndOfFile)⚠️ 路径可能因系统而异可搜索msado15.dll。步骤 2设计通用数据库操作类CRxADO// RxADO.h#pragmaonce#includeatlbase.h// 用于 CComBSTRclassCRxADO{private:_ConnectionPtr m_pConnection;// 连接对象_RecordsetPtr m_pRecordset;// 结果集对象public:CRxADO();~CRxADO();// 初始化连接BOOLConnect(LPCTSTR lpszDSN,LPCTSTR lpszUser,LPCTSTR lpszPwd);// 执行非查询 SQLINSERT/UPDATE/DELETEBOOLExecuteSQL(LPCTSTR lpszSQL);// 执行查询返回记录集_RecordsetPtrGetRecordset(LPCTSTR lpszSQL);// 关闭连接voidClose();// 判断记录集是否为空BOOLIsRecordsetEmpty(_RecordsetPtr pRs);};// RxADO.cpp#includestdafx.h#includeRxADO.hCRxADO::CRxADO(){CoInitialize(NULL);// 初始化 COMm_pConnectionNULL;m_pRecordsetNULL;}CRxADO::~CRxADO(){Close();CoUninitialize();// 释放 COM}BOOLCRxADO::Connect(LPCTSTR lpszDSN,LPCTSTR lpszUser,LPCTSTR lpszPwd){try{m_pConnection.CreateInstance(__uuidof(Connection));CString strConn;strConn.Format(_T(ProviderOraOLEDB.Oracle;Data Source%s;User ID%s;Password%s;),lpszDSN,lpszUser,lpszPwd);m_pConnection-Open((LPCTSTR)strConn,,,adConnectUnspecified);returnTRUE;}catch(_com_errore){AfxMessageBox(e.ErrorMessage());returnFALSE;}}_RecordsetPtrCRxADO::GetRecordset(LPCTSTR lpszSQL){try{m_pRecordset.CreateInstance(__uuidof(Recordset));m_pRecordset-Open(lpszSQL,m_pConnection.GetInterfacePtr(),adOpenStatic,adLockReadOnly,adCmdText);returnm_pRecordset;}catch(_com_errore){AfxMessageBox(e.ErrorMessage());returnNULL;}}BOOLCRxADO::ExecuteSQL(LPCTSTR lpszSQL){try{m_pConnection-Execute(lpszSQL,NULL,adExecuteNoRecords);returnTRUE;}catch(_com_errore){AfxMessageBox(e.ErrorMessage());returnFALSE;}}voidCRxADO::Close(){if(m_pRecordsetm_pRecordset-StateadStateOpen)m_pRecordset-Close();if(m_pConnectionm_pConnection-StateadStateOpen)m_pConnection-Close();}BOOLCRxADO::IsRecordsetEmpty(_RecordsetPtr pRs){return(pRsNULL||pRs-EndOfFile);}✅ 使用OraOLEDB.Oracle提供程序需安装 Oracle Client。知识点 2自定义按钮类CBaseButton目的实现圆角、背景色、鼠标悬停效果的按钮。// BaseButton.h#pragmaonceclassCBaseButton:publicCButton{public:CBaseButton();virtual~CBaseButton();protected:DECLARE_MESSAGE_MAP()afx_msgvoidOnPaint();afx_msg BOOLOnEraseBkgnd(CDC*pDC);afx_msgvoidOnMouseMove(UINT nFlags,CPoint point);afx_msgvoidOnMouseLeave();private:BOOL m_bHover;// 是否鼠标悬停CBrush m_brNormal,m_brHover;};// BaseButton.cpp#includestdafx.h#includeBaseButton.hCBaseButton::CBaseButton():m_bHover(FALSE){m_brNormal.CreateSolidBrush(RGB(240,240,240));// 默认灰色m_brHover.CreateSolidBrush(RGB(255,220,180));// 悬停橙色}CBaseButton::~CBaseButton(){}BEGIN_MESSAGE_MAP(CBaseButton,CButton)ON_WM_PAINT()ON_WM_ERASEBKGND()ON_WM_MOUSEMOVE()ON_WM_MOUSELEAVE()END_MESSAGE_MAP()voidCBaseButton::OnPaint(){CPaintDCdc(this);CRect rect;GetClientRect(rect);// 绘制圆角矩形背景CBrush*pOldBrushdc.SelectObject(m_bHover?m_brHover:m_brNormal);dc.RoundRect(rect,CPoint(10,10));// 圆角半径 10dc.SelectObject(pOldBrush);// 绘制文字CString strText;GetWindowText(strText);dc.SetBkMode(TRANSPARENT);dc.DrawText(strText,rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);}BOOLCBaseButton::OnEraseBkgnd(CDC*pDC){returnTRUE;// 防止闪烁}voidCBaseButton::OnMouseMove(UINT nFlags,CPoint point){if(!m_bHover){m_bHoverTRUE;Invalidate();// 重绘TRACKMOUSEEVENT tme;tme.cbSizesizeof(tme);tme.dwFlagsTME_LEAVE;tme.hwndTrackm_hWnd;TrackMouseEvent(tme);}CButton::OnMouseMove(nFlags,point);}voidCBaseButton::OnMouseLeave(){m_bHoverFALSE;Invalidate();CButton::OnMouseLeave();}✅ 在对话框资源中将普通 Button 控件的类型改为 “Owner Draw”并绑定到CBaseButton。知识点 3扩展组合框CBaseComboBox功能支持自动完成、下拉项高亮// BaseComboBox.hclassCBaseComboBox:publicCComboBox{DECLARE_DYNAMIC(CBaseComboBox)public:CBaseComboBox();virtual~CBaseComboBox();protected:DECLARE_MESSAGE_MAP()afx_msgvoidOnCbnEditupdate();};// BaseComboBox.cppIMPLEMENT_DYNAMIC(CBaseComboBox,CComboBox)CBaseComboBox::CBaseComboBox(){}CBaseComboBox::~CBaseComboBox(){}BEGIN_MESSAGE_MAP(CBaseComboBox,CComboBox)ON_CONTROL_REFLECT(CBN_EDITUPDATE,CBaseComboBox::OnCbnEditupdate)END_MESSAGE_MAP()voidCBaseComboBox::OnCbnEditupdate(){// 可在此实现输入时自动筛选简化版CString strInput;GetWindowText(strInput);// 实际项目中可遍历下拉项匹配前缀}更高级功能可结合SetDroppedWidth()、SetItemHeight()等 API。三、模块级实现示例示例 1系统登录模块// LoginDlg.cppvoidCLoginDlg::OnBnClickedOk(){UpdateData(TRUE);// 从控件获取数据if(m_strUser.IsEmpty()||m_strPwd.IsEmpty()){AfxMessageBox(_T(用户名或密码不能为空));return;}CRxADO db;if(!db.Connect(_T(AutoPartsDB),m_strUser,m_strPwd)){AfxMessageBox(_T(数据库连接失败));return;}// 查询用户是否存在假设用户表 USERSCString strSQL;strSQL.Format(_T(SELECT COUNT(*) FROM USERS WHERE USERNAME%s AND PASSWORD%s),m_strUser,m_strPwd);_RecordsetPtr rsdb.GetRecordset(strSQL);if(!db.IsRecordsetEmpty(rs)){longcountrs-Fields-GetItem(_variant_t(COUNT(*)))-Value.lVal;if(count0){CDialogEx::OnOK();// 登录成功return;}}AfxMessageBox(_T(用户名或密码错误));}⚠️ 实际项目应使用参数化查询防 SQL 注入ADO 支持_CommandPtr 参数。示例 2商品信息查询基础信息模块// GoodsQueryDlg.cppvoidCGoodsQueryDlg::LoadGoodsList(){m_listCtrl.DeleteAllItems();// 清空列表CRxADO db;if(!db.Connect(_T(AutoPartsDB),_T(auto_parts),_T(ap_password)))return;CString strSQL_T(SELECT GOODS_ID, NAME, BRAND, PRICE FROM GOODS_INFO ORDER BY GOODS_ID);_RecordsetPtr rsdb.GetRecordset(strSQL);if(db.IsRecordsetEmpty(rs))return;intnIndex0;while(!rs-EndOfFile){CString id(LPCTSTR)(_bstr_t)rs-Fields-GetItem(_T(GOODS_ID))-Value;CString name(LPCTSTR)(_bstr_t)rs-Fields-GetItem(_T(NAME))-Value;CString brand(LPCTSTR)(_bstr_t)rs-Fields-GetItem(_T(BRAND))-Value;CString price(LPCTSTR)(_bstr_t)rs-Fields-GetItem(_T(PRICE))-Value;m_listCtrl.InsertItem(nIndex,id);m_listCtrl.SetItemText(nIndex,1,name);m_listCtrl.SetItemText(nIndex,2,brand);m_listCtrl.SetItemText(nIndex,3,price);rs-MoveNext();nIndex;}}✅ 假设使用CListCtrl控件需设置报表视图Report View。四、综合性案例日常业务处理入库 出库场景商品入库登记数据库表设计简化-- 商品表CREATETABLEGOODS_INFO(GOODS_ID VARCHAR2(20)PRIMARYKEY,NAME VARCHAR2(100),BRAND VARCHAR2(50),STOCK NUMBERDEFAULT0);-- 入库记录表CREATETABLESTOCK_IN(RECORD_ID NUMBER GENERATED ALWAYSASIDENTITY,GOODS_ID VARCHAR2(20),QUANTITY NUMBER,OPERATOR VARCHAR2(50),IN_TIMEDATEDEFAULTSYSDATE);VC 实现入库逻辑voidCStockInDlg::OnBnClickedBtnSave(){UpdateData(TRUE);if(m_strGoodsId.IsEmpty()||m_nQuantity0){AfxMessageBox(_T(请填写完整信息));return;}CRxADO db;if(!db.Connect(_T(AutoPartsDB),_T(auto_parts),_T(ap_password)))return;// 1. 更新库存CString sqlUpdate;sqlUpdate.Format(_T(UPDATE GOODS_INFO SET STOCK STOCK %d WHERE GOODS_ID %s),m_nQuantity,m_strGoodsId);// 2. 插入入库记录CString sqlInsert;sqlInsert.Format(_T(INSERT INTO STOCK_IN (GOODS_ID, QUANTITY, OPERATOR) VALUES (%s, %d, %s)),m_strGoodsId,m_nQuantity,_T(admin));// 事务处理简化顺序执行if(db.ExecuteSQL(sqlUpdate)db.ExecuteSQL(sqlInsert)){AfxMessageBox(_T(入库成功));OnCancel();// 关闭窗口}else{AfxMessageBox(_T(入库失败));}}生产环境应使用 ADO 事务m_pConnection-BeginTrans();// 执行多个 SQLm_pConnection-CommitTrans();// 或 RollbackTrans()五、小结关键技术栈技术点说明ADO 编程通过_ConnectionPtr,_RecordsetPtr操作 OracleOracle OLE DB使用OraOLEDB.Oracle提供程序需安装 Oracle Client自定义控件重绘CButton、扩展CComboBox提升 UI 体验数据库类封装CRxADO实现连接、查询、执行统一管理MFC 对话框交互结合DoDataExchange、控件变量实现数据绑定业务逻辑分层登录、查询、业务处理模块解耦六、附初始化数据库脚本Oracle-- 用户表登录用CREATETABLEUSERS(USERNAME VARCHAR2(50)PRIMARYKEY,PASSWORD VARCHAR2(50)NOTNULL,REAL_NAME VARCHAR2(100));INSERTINTOUSERSVALUES(admin,123456,系统管理员);-- 商品信息表CREATETABLEGOODS_INFO(GOODS_ID VARCHAR2(20)PRIMARYKEY,NAME VARCHAR2(100)NOTNULL,BRAND VARCHAR2(50),SPEC VARCHAR2(100),-- 规格UNIT VARCHAR2(10),-- 单位PRICE NUMBER(10,2),STOCK NUMBERDEFAULT0);-- 日常业务入库/出库CREATETABLESTOCK_RECORD(RECORD_ID NUMBER GENERATED ALWAYSASIDENTITY,GOODS_ID VARCHAR2(20),TYPECHAR(1),-- I入库, O出库QUANTITY NUMBER,OPERATOR VARCHAR2(50),RECORD_TIMEDATEDEFAULTSYSDATE);提示若使用 Visual Studio 2022默认字符集为 Unicode所有字符串使用_T()宏。Oracle 字段名建议大写避免大小写敏感问题。生产系统务必使用参数化查询防止 SQL 注入。如需提供完整工程结构、主窗体菜单设计或报表打印模块可继续扩展。