MFC与ADO结合实现存储过程调用
作者:Justine-zhu | 来源:互联网 | 2024-12-22 14:22
本文介绍如何使用MFC和ADO技术调用SQLServer中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。
### 用户界面设计 用户界面允许用户选择要查询的小区(Cell ID)、起始时间和结束时间。选择完成后,点击“确定”按钮触发查询操作。 ![用户界面示例](https://img-blog.csdn.net/20160120203713540) ### 存储过程定义 存储过程 `TraffStatisticInfo` 用于统计指定小区在给定时间范围内的通话数据。它接收三个参数:小区ID (`cellid`)、开始时间 (`startTime`) 和结束时间 (`endTime`),并返回每个小时段的平均通话量 (`avgTraff`)、拥塞率 (`congsP`) 和半速率通话比例 (`thtraffP`)。 ```sql /* 话务统计信息查询。通过用户选定的小区(cellid),开始时间(startTime), 结束时间(endTime),计算得到小时级话务量(avgTraff),小时级拥塞率(congsP), 小时级半速率话务量比例(thtraffP) startTime, endTime 格式为YYYYMMDDhh 时间time存储格式为int,含义为hhmmss,time/10000为小时 日期date格式为YYYYMMDD */ CREATE PROCEDURE TraffStatisticInfo ( @cellid INT, @startTime INT, @endTime INT ) AS BEGIN SELECT (date * 100 + time / 10000) AS hour, AVG(traff) AS avgTraff, SUM(congsnum) / SUM(callnum) AS congsP, SUM(thtraff) / SUM(traff) AS thtraffP FROM data WHERE cellid = @cellid AND (date * 100 + time / 10000) >= @startTime AND (date * 100 + time / 10000) <= @endTime GROUP BY (date * 100 + time / 10000) ORDER BY (date * 100 + time / 10000) END ``` ### 调用存储过程 在MFC应用程序中,我们使用自定义的 `CDataBase` 类来连接数据库,并通过 ADO 技术执行存储过程。以下是关键代码片段,展示了如何从用户界面上获取输入参数并调用存储过程。 ```cpp void TraffStatisticDlg::OnQuery() { // 获取用户输入的小区ID CString CellID; GetDlgItem(IDC_COMBO_CellID)->GetWindowText(CellID); int cellID = _ttoi(CellID); // 获取开始时间和结束时间 CTime m_date; int startTime, endTime; // 处理开始时间 ((CDateTimeCtrl*)GetDlgItem(IDC_StartDate))->GetTime(m_date); int year1 = m_date.GetYear(); int month1 = m_date.GetMonth(); int day1 = m_date.GetDay(); ((CDateTimeCtrl*)GetDlgItem(IDC_StartHour))->GetTime(m_date); int hour1 = m_date.GetHour(); startTime = year1 * 1000000 + month1 * 10000 + day1 * 100 + hour1; // 处理结束时间 ((CDateTimeCtrl*)GetDlgItem(IDC_EndDate))->GetTime(m_date); int year2 = m_date.GetYear(); int month2 = m_date.GetMonth(); int day2 = m_date.GetDay(); ((CDateTimeCtrl*)GetDlgItem(IDC_EndHour))->GetTime(m_date); int hour2 = m_date.GetHour(); endTime = year2 * 1000000 + month2 * 10000 + day2 * 100 + hour2; // 创建Command对象实例 _CommandPtr pCommand; CDataBase DB; // 自定义数据库连接类 DB.Connect(); HRESULT hr; if (FAILED(hr = pCommand.CreateInstance(__uuidof(Command)))) _com_issue_error(hr); pCommand->ActiveCOnnection= DB.m_Connect; pCommand->CommandType = adCmdStoredProc; pCommand->CommandText = L"TraffStatisticInfo"; // 设置存储过程参数 _ParameterPtr pCellID = pCommand->CreateParameter(L"cellid", adInteger, adParamInput, 20, (_variant_t)(long)cellID); _ParameterPtr pStartTime = pCommand->CreateParameter(L"startTime", adInteger, adParamInput, 20, (_variant_t)(long)startTime); _ParameterPtr pEndTime = pCommand->CreateParameter(L"endTime", adInteger, adParamInput, 20, (_variant_t)(long)endTime); pCommand->Parameters->Append(pCellID); pCommand->Parameters->Append(pStartTime); pCommand->Parameters->Append(pEndTime); // 执行存储过程 _RecordsetPtr pRst; pRst.CreateInstance(__uuidof(Recordset)); pRst = pCommand->Execute(NULL, NULL, adCmdStoredProc); // 处理返回结果 int len = 50; int* hour = (int*)malloc(sizeof(int) * len); double* avgTraff = (double*)malloc(sizeof(double) * len); double* cOngsP= (double*)malloc(sizeof(double) * len); double* thtraffP = (double*)malloc(sizeof(double) * len); int i = 0; for (; !pRst->adoEOF; pRst->MoveNext()) { hour[i] = pRst->GetCollect(L"hour").intVal; avgTraff[i] = pRst->GetCollect(L"avgTraff").dblVal; congsP[i] = pRst->GetCollect(L"congsP").dblVal; thtraffP[i] = pRst->GetCollect(L"thtraffP").dblVal; i++; } pRst->Close(); DB.ExitConnect(); } ``` 通过上述步骤,我们可以有效地从数据库中获取所需的数据,并将其展示给用户,以便进一步分析和处理。
推荐阅读
本文探讨了在 SQL Server 中使用 JDBC 插入数据时遇到的问题。通过详细分析代码和数据库配置,提供了解决方案并解释了潜在的原因。 ...
[详细]
蜡笔小新 2024-12-21 09:52:27
本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ...
[详细]
蜡笔小新 2024-12-22 18:39:17
目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ...
[详细]
蜡笔小新 2024-12-22 18:53:43
本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ...
[详细]
蜡笔小新 2024-12-22 14:43:35
本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ...
[详细]
蜡笔小新 2024-12-21 18:17:57
小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ...
[详细]
蜡笔小新 2024-12-22 13:59:04
在众多管理系统中,如菜单、分类和部门等模块,通常需要处理层级结构。为了高效管理和展示这些层级数据,本文将介绍如何使用 PHP 实现多级树形结构,并提供代码示例以帮助开发者轻松实现无限分级。 ...
[详细]
蜡笔小新 2024-12-22 12:29:28
本文详细介绍了Hive中用于日期和字符串相互转换的多种函数,包括从时间戳到日期格式的转换、日期到时间戳的转换,以及如何处理不同格式的日期字符串。通过这些函数,用户可以轻松实现日期和字符串之间的灵活转换,满足数据处理中的各种需求。 ...
[详细]
蜡笔小新 2024-12-21 20:34:59
1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ...
[详细]
蜡笔小新 2024-12-21 20:05:21
探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ...
[详细]
蜡笔小新 2024-12-21 18:26:33
本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ...
[详细]
蜡笔小新 2024-12-21 17:42:25
本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ...
[详细]
蜡笔小新 2024-12-21 17:33:44
本文详细介绍了 MySQL 的基础连接、数据库及表的操作,涵盖创建、修改、删除等常用命令,并深入解析了数据类型、列属性、索引、外键和存储引擎等内容。 ...
[详细]
蜡笔小新 2024-12-21 16:49:16
本文介绍如何在MySQL中创建一个自定义函数,用于将包含多个班级编号的字符串拆分为对应的班级名称。通过详细解释代码逻辑和功能,帮助读者理解并应用这一技术。 ...
[详细]
蜡笔小新 2024-12-21 14:07:47
本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ...
[详细]
蜡笔小新 2024-12-21 13:56:06
Justine-zhu
这个家伙很懒,什么也没留下!