热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MFC与ADO结合实现存储过程调用

本文介绍如何使用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 插入数据时遇到的问题。通过详细分析代码和数据库配置,提供了解决方案并解释了潜在的原因。 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • PHP 实现多级树形结构:构建无限层级分类系统
    在众多管理系统中,如菜单、分类和部门等模块,通常需要处理层级结构。为了高效管理和展示这些层级数据,本文将介绍如何使用 PHP 实现多级树形结构,并提供代码示例以帮助开发者轻松实现无限分级。 ... [详细]
  • 本文详细介绍了Hive中用于日期和字符串相互转换的多种函数,包括从时间戳到日期格式的转换、日期到时间戳的转换,以及如何处理不同格式的日期字符串。通过这些函数,用户可以轻松实现日期和字符串之间的灵活转换,满足数据处理中的各种需求。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • MySQL 基础操作与优化
    本文详细介绍了 MySQL 的基础连接、数据库及表的操作,涵盖创建、修改、删除等常用命令,并深入解析了数据类型、列属性、索引、外键和存储引擎等内容。 ... [详细]
  • 本文介绍如何在MySQL中创建一个自定义函数,用于将包含多个班级编号的字符串拆分为对应的班级名称。通过详细解释代码逻辑和功能,帮助读者理解并应用这一技术。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
author-avatar
Justine-zhu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有