VC++中实现数据加密(精选8篇)
VC++中实现数据加密 第1篇
为了保证数据的安全性与完整性,常常要对数据进行加密,在数据传输过程进行数据加密可以防止中途非法截获,我们通常称原始数据叫做源文,用约定的加密算法进行加密处理。加密算法的输入是源文与加密键,而输出的则是密文。加密算法可以分为两种,一种是密键加密算法,一种是明键加密法。
一、密键加密法:
加密算法可以公开,但加密键一定要保密。密文对不知道加密键的人来说,是不容易解密的。如下述算法:
A.把源文分成等长的块,每块的长度和加密键的长度相等,对长度不够的块用空格补充;
B.用自己定义的整数代替源文的数据;
C.对加密键也进行数据替换操作;
D.对源文的整数码与加密键相应字符的整数码进行相加,然后对某一整数进行取模操作;
E.将整数码再用相应的字符进行替换,这样就得到了密文。
实现代码如下:
CString CEncryptDlg::Encrypt_Key(CString Source,CString Key)
{
int iSourceLen,iKeyLen;
int iCount;
div_t div_Result;
char strTarget[255];
char pKey[255],pSource[255],pMid[255];
CString strTmp;
int i,j,n;
BYTE PWD_key[255];
j=0;
for (i=32;i<=126;i++)
{
PWD_key[i]=j;
j++;
}//取ASCII值在32~126之间的可视字符
iSourceLen=Source.GetLength();
iKeyLen=Key.GetLength();
div_Result=div(iSourceLen,iKeyLen);
if (div_Result.rem)
iCount=div_Result.quot+1;
else
iCount=div_Result.quot;
wsprintf(pKey,“%s”,m_Key);
n=0;
for (i=1;i<=iCount;i++)
{
strTmp=Source.Mid((i-1)*iKeyLen,iKeyLen);
if (strTmp.GetLength()
{
for (j=1;j<=iKeyLen-strTmp.GetLength();j++)
strTmp+=“ ”;
}
wsprintf(pSource,“%s”,strTmp);
for (j=1;j<=iKeyLen;j++)
{
int k1;
int k2;
k1=PWD_key[pKey[j-1]];
k2=PWD_key[pSource[j-1]];
int k=k1+k2;
div_Result=div(k,ENCRYPT_KEY);
k=div_Result.rem;
pMid[j-1]=k;
strTarget[n++]=k;
}//对源文进行替换加密处理
}
for (j=0;j
{
strTarget[j]+=32;
if (strTarget[j]==32) strTarget[j]='*'; //用“*”替代密文中的空格
}
strTarget[n]='�';
CString strResult;
strResult.Format(“%s”,strTarget);
return(strResult);
}
注:对D步的数据处理,每人也可以根据自己的具体情况用别的计算方法替换,
二、明键加密算法
明键加密算法可以随意使用加密算法与加密键,但是解密键是保密的。所在,它同时需要两个键,一个用于加密,一个用于解密。而解密键不能从加密键推出的。从而,每个人都可以对源文进行加密操作,但是在没有授权进行解密时,他是不能完成解密工作的,因为他不知道解密键。具体算法如下所述:
A.任意选择两个质数p与q,它们取值最好在100位左右。同时计算r=p*q;
B.任意选择一个整数e,e是与(p-1)*(q-1)互为质数的,e就是算法中的加密键;
C.求解方程式:(d*e) mod ((p-1)*(q-1))=1,d即是加密算法中的解密键;
D.对源文p进行加密即可得到密文,计算公式为c=pe mod r;c即为密文;
E.对密文c进行解密即可得到源文,计算公式为p=cd mod r;p即为源文;
加密算法实现如下:
CString CEncryptDlg::Encrypt_KnownKey(CString Source)
{
int r=ENCRYPT_P*ENCRYPT_Q;
int e=101;
//设置加密键,一般比P与Q大的质数就可以选作加密键
int k=(ENCRYPT_P-1)*(ENCRYPT_Q-1);
int d=5;
//求得解密键,即满足公式:(d*11) mod k=1
char pSource[255];
char pTarget[255];
int iLen;
int i;
DWORD dw1;
wsprintf(pSource,“%s”,m_Source);
iLen=m_Source.GetLength();
for (i=0;i
{
div_t div_Result;
dw1=Exp(pSource[i],e,r);
div_Result=div(dw1,r);
pTarget[i]=div_Result.rem;
//获取密文
}
pTarget[iLen]='�';
CString strTarget;
strTarget.Format(“%s”,pTarget);
return(strTarget);
}
解密算法如下:
CString CEncryptDlg::Decode_KnownKey(CString Source)
{
int r=ENCRYPT_P*ENCRYPT_Q;
int e=101;
//设置加密键,一般比P与Q大的质数就可以选作加密键
int k=(ENCRYPT_P-1)*(ENCRYPT_Q-1);//k=168
int d=5;
//求得解密键,即满足公式:(d*29) mod k=1
int iLen=m_Source.GetLength();
char pSource[255],pTarget[255];
wsprintf(pSource,“%s”,m_Source);
for (int i=0;i
{
DWORD dw1;
VC++中实现数据加密 第2篇
为了简化问题,该数据库的表中只有一个名为Images的OLE字段,我使用DAO连接操作数据库,读取的图像数据显示在一个对话框上,至于使用ODBC、DAO还是ADO,这要根据具体情况而定,但无论使用哪一种,对图像的显示来说,实现的过程是大同小异的。由于篇幅有限,文章中对如何实现数据库的连接不再作具体的说明,有兴趣的读者朋友可以参考VC数据库编程的资料。实现过程中,首先定义一个CDaoRecordset的子类 CimageData如下:
class CimageData : public CDaoRecordset
{
public:
CimageData (CDaoDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CimageData)
file://{{AFX_FIELD(CimageData, CDaoRecordset)
CByteArray m_Images;//声明字节数组用来存放图像数据
file://}}AFX_FIELD
// Overrides
// ClassWizard generated virtual function overrides
file://{{AFX_VIRTUAL(CimageData)
public:
virtual CString GetDefaultDBName();
virtual CString GetDefaultSQL();
virtual void DoFieldExchange(CDaoFieldExchange* pFX);
file://}}AFX_VIRTUAL
该类的实现为:
CimageData:: CimageData (CDaoDatabase* pdb)
: CDaoRecordset(pdb)
{
file://{{AFX_FIELD_INIT(CimageData)
m_nFields = 1;//数据库的表中仅有一个字段
在数据网络发展中实现绿色环保 第3篇
在技术发展与用户需求的驱动下, IT与电信业互相渗透, 这昭示着电信业一个新的时代已经来临。宽带特别是移动宽带将进入快速发展轨道。全球移动用户数已经超过35亿户, 而在未来的几年内更将超过50亿户, 人类社会真正进入网络化社会, 通信也将进入全网IP化。
在数据网层面, 未来各业务网的承载网络应该逐步走向融合, 朝着统一的IP承载网方向发展, 从而实现各种综合业务的接入和承载。这些都需要增加相应的网络设备作为支撑。在数据中心的电力能耗中, IT设备、机房制冷和电源设备分别是5:4:1的比例, 也就是服务器、存储、交换机的电力消耗占总能耗的50%, 机房制冷电力能耗占40%, UPS等电源设备占10%[2]。电能的消耗过大, 将直接导致一系列环境问题, 其中温室效应的危害尤为突出, 由此可见, 节能降耗实现绿色环保迫在眉睫。
2 数据网络发展中实现绿色环保的对策和建议
2.1 改善设备结构
高效的提高机房的利用率, 尽量降低设备的重量, 越来越成为运营商和设备制造商必须考虑的重要因素。改善设备构造, 减轻重量, 减少体积, 可以进一步提高机房利用率, 为节能降耗提供了很好的支持。
2.2 模块共享
设备采用模块化设计思路, 明确各模块之间的规格和接口定义, 建立通用模块, 实现整机模块最大程度的归一化复用。具体包括:设备采用统一的风扇框, 统一的安装附件, 按照不同要求, 只需要更换风扇就可以满足各种需求。电源区独立出来, 作为一个单独的模块拼装, 几款机箱共用这个框体。电源交流和直流模块全部共用, 从而实现节能环保。
2.3 电源系统优化
据业界主要通信设备分析结果, 电源转换损耗约占通信设备的30%, 电源系统是节能的重点之一。在传统数据设备中, 无论初始是如何配置, 都直接一次性满配置1+1的AC模块, 这样当配置功率较小时, 导致电源的转换效率大大降低, 浪费了大量的能源, 不符合节能减排降功耗需求。针对上述情况, 可以采用把AC电源模块按需配置的架构, 根据需要配置不同功率等级的电源系统, 提高电源的利用效率, 从而达到节能降耗的目的。
2.4 散热系统优化
在通信系统中, 散热是一个重要的节能因素, 较高的散热效率可以大大的降低系统的能耗。所以需要对设备设计高效的散热风道, 以及优化走线空间。
风扇在系统散热中是最关键的部件, 如何降低风扇的能耗、提高风扇的散热效率、降低风扇的数量、提高系统的可靠性, 是通信系统一直面临的技术难题。而设计智能风扇, 分区间控温, 这样当设备内部某敏感器件温度高于设定值则增加转速, 当均低于设定值则降低转速, 最终控制产品及风扇恒定在稳定的状态中, 达到增强可靠性、节能、降耗的目的。
2.5 机房散热优化
数据通信设备结构不同于传统设备, 散热量高, 布放密集, 温度要求高, 机房热管理问题严重, 尤其是局部过热问题日益突出。因此设备的散热问题不能仅仅考虑自身的散热, 需要在机房这个大环境中统筹考虑。
根据分析了典型机房的能耗分布后, 发现空调能耗占机房总能耗的50%, 降低空调能耗成为机房节能减排的一个关键。传统机房机柜同一朝向, 形成级联加热, 冷热气流混合交叉, 局部过热问题严重, 最终导致空调制冷效率低下[4]。
2.5.1 适度扩大设备工作温度范围
由于某些设备工作的温度范围较窄, 传统机房的平均温度只有24℃~26℃, 制冷效率比较低, 而扩大设备工作温度范围后, 可以适当的提高机房温度, 从而降低能耗。
2.5.2 改变回风方式
设备的出风口通过专用的回风管道送到空调的回风口, 冷热气流完全隔离, 彻底避免冷热气流混合, 而且整个房间充满冷空气, 即使空调断电, 也可保证设备安全运行一段时间。
2.5.3 冷热通道
传统机房机柜同一朝向, 冷热气流混合交叉, 不利于机房的散热, 可以使用冷热通道技术, 把机柜面朝面、背朝背放置, 形成冷热通道, 再加上简单的机房通道隔离即可大大改善冷热气流混合交叉的问题。
3 结语
随着社会的进步, 网络流量在未来几年内将会增长十倍甚至百倍, 驱动承载网进入端到端的T-bit时代。尤其中国这样的人口和地域大国, 对设备及其容量需求会更大。因此, 构建绿色环保的数据网络就显得尤为重要。绿色通信网络的构建任重而道远, 许多问题还有待于进一步研究。
参考文献
[1]胡晓女.把脉通信能源消耗, 打造绿色数据中心.通信世界网.
[2]蒋均牧.联通IDC机房达150个, 年支出电费5.2亿元.中国通信网.
[3]阿尔卡特朗讯助中国移动基站降低能耗, 通信世界网.
[4]郭春山.通信机房空调优化节能方案探讨.中国论文下载中心.
VC++中实现数据加密 第4篇
VC++中实现数据加密 第5篇
一、实现原理
Teamcenter (UA) 中的基本数据结构是Item结构:
Item
|--Item Revision (版本对象)
|--IR Form (属性表)
|--Data sets (数据集)
Item是系统最基本的业务对象, Item Revision是版本对象, 用来管理各个版本的数据。属性表保存了版本的详细属性;数据集封装了物理文件。
在实施过程中, 我们通常会帮助企业整理有价值的历史数据作为PDM系统上线时的基础和参考, 比如标准件库, 有代表性的机种等等。一般情况下, 我们会把整理数据整理成Excel格式。所以要求历史数据导入工具需要能够分析Excel文件, 并且在Teamcenter (UA) 系统中创建上述数据结构。对于最常用的数据导入要求, 我把它分为三个主要的功能模块进行设计:
Item对象:逐个导入Item对象结构, 包括Item、Item Revision、数据集以及他们的关联关系
B O M对象:在导入Item对象结构的基础上再创建Bom结构, 表达零部件Bom关系;
Relation对象:导入若干Item对象之间的关系
对于上述三种业务逻辑, 可以把程序划分为“Excel读取”“数据创建”“驱动引擎”“导入日志”等模块进行设计:
二、关键技术
1. 通用性设计
为了使导入工具能处理尽量多种类型的数据源, 它有以下特点:
每个属性都有标示符, 表示它属于哪个类的属性, 是Item的还是DS的?
当读取属性名称列, 遇到空白列时, 标记这是列结尾。
当读取到行号为空的行时, 标记这是最后一行数据
提供多种可选选项, 配置导入后的一些后续动作。如:若同名DS存在是否覆盖, 若对象存在是否覆盖?
标记Bom关系上的属性, 例如:单位、数量等等
导入后能把所有权更改成另一用户, 能添加发布状态
2. POI读写Excel技术
导入必要的包
import org.apache.poi.hssf.usermodel.*;
定义Workbook对象:
public HSSFWorkbook wb=null;
打开Excel工作簿
wb=new HSSFWorkbook (filein) ;
读取单元格
读入字符串使用语句:
getStringCellValue () ;
读入数字使用语句:
getNumericCellValue () ;
写入单元格 (按格式写入)
写入字符串:
setStringCellValue (字符串) ;
写入数字:
setNumericCellValue (数字) ;
保存Excel工作簿
只需要保存新建workbook时输入的FileInputStream就能保存文件filein.close () ;
3. 基于Eclipse Plugins的两层Richclient二次开发
Teamcenter (UA) 两层Richclient是架构在Eclipse平台上的应用系统。各部件是按照Eclipse Plugins插件方式嵌入到整个系统的。我们所要开发的历史数据导入工具也作为一个插件被加载和运行的。
准备好Eclipse开发环境
Eclipse的版本要求是3.2以上, 推荐使用3.3
Jre版本要求在1.5.2.06以上
在Eclipse中新建一个插件工程并导入必要的Teamcenter开发包 (一些Jar文件)
在Eclipse中新建一个Plug-in Project
在工具栏添加按钮, 修改plugin.xml文件, 添加按钮命令按钮。
三、应用实例
本工具已经通过了一定的压力测试, 在某国企重型机械单位, 曾经成功批量导入过最多5300多行的数据, 服务器配置为2CUP*3.2G;内存4G。每分钟平均导入98条数据。在三天之内帮助企业把三十几个机型的产品结构全部录入Teamcenter (UA) 系统。
四、小结
如上所述, 在对历史数据导入逻辑的抽象和泛化的基础上, 运用Java、Eclipse、POI、Excel宏等多种技术对Teamcenter (UA) 进行客户化开发, 实现了通用格式对象导入功能。在这个功能的辅助下, 我们能够很好的导入必要的历史数据, 为PDM系统上线做好铺垫。
摘要:在PDM系统的实施阶段, 必须把企业的历史数据导入到这个系统。这些历史数据凝结了企业的知识, 是PDM初始环境必不可少的一部分。本文阐述了基于Teamcenter (UA) 的历史数据导入工具的设计原理与过程。
关键词:PDM,Teamcenter (UA) ,数据导入,POI,Eclipse
参考文献
[1]《制造企业的产品数据管理-原理、概念、策略》[德]肖塔纳著, 祁国宁译[M].电子工业出版社, 1999
[2]《Teamcenter 2007 Getting Started with Customization》SiemensTeamcenter[A].2007
VC++中实现数据加密 第6篇
关键词:实现 动态查询 PowerBuilder
中图分类号:TP311.132 文献标识码:A
0 引言
PowerBuilder是现今最为流行的数据库前端开发工具。掌握PowerBuilder开发工具固然重要,但运用开发工具开发一个有效的、易维护的、易升级的、功能强大的管理系统尤为重要。本文利用PowerBuilder开发工具应用在汽配管理系统为例,探讨了汽配管理系统的制作方法,着重研究了动态查询在汽配管理系统中的实现方式,延伸了Powerbuilder开发工具实用性。
1 汽配管理系统的系统分析
本系统是面向汽车配件销售管理的管理信息系统。该系统能对汽车配件行业进行进货、销售、存储的有效管理,且能集中管理汽车配件的应收应付帐,并能实现查询分析统计等功能,及时响应企业汽车配件进销的快速查询和分析,使企业经营运作物流清晰,经营状况一目了然。汽配管理系统数据表结构及表间关系详见图1。
2 动态查询的实现
在PowerBuilder中,动态查询的实现归根结底就是在应用程序中完成一个Datawindow的制作,而可通过SQL语句的转换得来[1]。因此,如何生成SQL语句就成了问题的关键。
分析SQL的SELECT语句:
Select’数据表’.’字段名’from’数据表’
……………第一部分
Where’表间关联条件’and’查询条件’
………………第二部分
从上述分析可以看出:SQL语句是有数据表及其字段、Where子句与表间关联等几部分组成的。寻找和利用其特点,就有可能实现动态查询。
2.1 数据表及字段的选择 数据表及字段的选择是指选择数据库中具体的数据表及所需查询的表字段,完成SQL语句的第一部分制作。在汽配管理系统中,供用户查询的数据表有8个,其中每个数据表拥有多个字段。为方便用户的选择,采用列表选择的方法,分别用两个列表显示数据表及其字段。当用户通过第一个列表选择数据表时,在第二个列表中显示出第一个列表所选择的数据表的所有字段。在第二个列表中,双击所需的字段名。这样的操作就选定了数据表及字段。实现上述选择的关键是:在汽配管理系统中的动态查询模块里,定义了两个字符型实例变量:LS-database[ ]及LS-field,分别容纳所选定的数据表名及字段名字符串[2]。在字段列表框双击事件中,又定义了两个字符型局部变量:Se-database及Se-field分别容纳双击后选定的数据表名和字段名。其实现流程图详见图2。
从图2可知,数组LS-database[ ]及LS-field中存储的内容,便是选定的数据表和字段名。
2.2 WHERE子句的生成 SQL语句的第二部分是Where子句。该子句是SQL语句的一个关键部分,用户正是通过它来满足检索的要求。Where子句是有逻辑关系符、检索字段名、检索操作符及检索值组成。其中逻辑关系符是指在Where子句间的“或者”和“并且”的关系。检索字段名是指用户提出检索要求的字段名。检索值是指对检索字段提出的要求。检索操作符是指检索字段与检索值之间的关系。Where子句的四个组成部分分别由三个下拉列表和一个单行编辑构成,其中检索字段下拉列表项由数据表及字段选择中选择出来的字段名组成。Where子句实现思路:通过循环算法,把多个Where子句的四个组成部分组合起来,形成条件查询子句。
2.3 数据表间的关联 在前两节的基础上即可顺利地选择出与字段,并生成Where子句及SQL语句。这时,制作并未完成。因为数据表间关联这个关键部分还没有解决。在Datawindow的人机交互制作过程中,表间关联可自动生成。但在应用程序里,生成Datawindow的过程必须通过应用程序设计编制才能实现[3]。表间关联的基本思路是:在PowerBuilder的数据库中,表间的关联是固定的,表与表之间的关联情况可以看成为一个二维表的关系。因此,在系统中设计了关系表查询方案,以解决数据表间的关联问题。所谓关系表,是指一个能反映任意两个表相联关系的二维表格。若两个表相关联,则在二维表格交叉栏内填入关联字段。若两个表不关联,则在二维表格交叉栏内填入空格。建立好关系表后,根据在数据表与表字段选择中所选择的数据表名(存储在数组LS-database[ ]中),在关系表中,两两查询关系。若两表关联,根据交叉项中所得的关系在Where子句中填入相应的语句即可完成。
2.4 Datawindow的生成 在表间关联子句生成后,SQL语句的制作便完成了。但如何将SQL语句转换成Datawindow呢?这里需要引进两个函数:SyntaxfromSQL()和Create():
函数SyntaxfromSQL()用于产生一个Datawindow,它拥有三个参数:第一个参数是用于传递SQL语句(即在2.2中所生成的SQL语句);第二个参数用来表示Datawindow的风格;第三个参数是在Datawindow生成过程中出错时保存错误信息。
函数Create(),使用从函数SyntaxfromSQL()中返回的属性信息,在运行状态下建立一个Datawindow。它有两个参数:第一个参数即是从SyntaxfromSQL()函数中返回的字符串变量。第二个参数用在出错时存储出错信息。
在系统中的具体实现代码如下:
String sq1-statement,present,error,answer
SQL-statement=……
//SQL-statement中存储着SQL描述语句
Present =”Style(type=grid)”
// Present 中存储着Datawindow风格等属性
answer=sqlca. SyntaxfromSQL()(SQL- statement, present,error)//产生Datawindow
Dw-1. Create(answer, error)//建立Datawindow
至此完成了动态查询的全部制作,实现了在PowerBuilder中动态查询。
3 结束语
通过以上建立的对数据表及字段的选择,把多个Where子句的四个组成部分组合起来表与表之间的关联看成了一个二维表的关系,运用函数SyntaxfromSQL()和函数Create()生成Datawindow,实现了在PowerBuilder中动态查询。
参考文献:
[1]崔巍.PowerBuilder8.0数据库应用系统开发教程[M].北京:清华大学出版社.2003.1:105-109.
[2]何军.PowerScript语言·事件·函数[M].北京:电子工业出版社.2003.6:255-258.
VC++中实现数据加密 第7篇
自动增长的数据类型是一种在一定条件下自动增加的数据类型,在数据库程序开发中具有广泛应用,但IB6.5数据库并没有该类型的变量。现在常用的数据库如Oracle、SQL Server、My SQL等均增加了该数据类型。本文通过使用IB6.5中的触发器和生成子的功能,实现了一种免维护的自增变量。
1 IB6.5简介
1.1 IB6.5的部分特性
Borland推出的IB有两个版本:一个是基于开放源代码的IB6.01;另一个是商业产品IB6.5。2002年底推出IB7.0,6.01版本可以免费获得而且免费使用IB7.0。
Borland将IB定位于“跨平台的嵌入式数据库”。它的跨平台性体现在:
(1)IB几乎可以完美地运行在几乎所有当今流行的操作系统上,其中包括所有的Windows平台(Windows 98、Me、NT4.0、2000、XP)、大部分Linux平台(RedHat、Mandrake、SuSe、Turbolinux)和Solaris平台。操作系统平台的独立性一方面保证了数据库的可移植性,另一方面也降低了成本。
(2)开发工具及连接的多样性和灵活性上。
1.2 触发器(Trigger)
触发器是IB数据库中非常灵活的组成部分,它由触发器头和触发器体组成。一个触发器必须和一个表或视图相关联,我们永远无法显式地调用一个触发器,这也是为什么容易犯错误的原因之一。
触发器头中包含:触发器名、表名、定义触发器何时触发的语句。
触发器体中包含:
(1)可选的局部变量列表(包括数据类型)。
(2)以IB存储过程和触发器语言写成的语句块,以BE-GINEND作为块的开始和结束标记。这些语句将在触发器触发时得到执行,语句块可以嵌套。
由于IB数据库本身的限制,它并不直接支持自动增长(Auto-Increment)数据类型,所以我们需要使用生成子配合来实现这一功能。
2 自增变量的实现方法
生成子提供了这样一种机制,可以为数据库中的表提供唯一的序列号,这一点和自动增长类型使用最广泛的地方即提供一个唯一的序列号(流水号)作为一个表的主键非常相似。IB会自动管理生成子的当前值,以保证不出现重复值,且数据库中生成子的数目是不限的。
通过创建不同的生成子,可以实现开发应用过程中各种流水号的计数功能,但生成子本身无法作为变量使用。IB6.5提供了对生成子的读取功能。在数据库提供的触发器中作一些简单的变换,就能实现各种序列号的数据格式,通过触发器本身与数据记录的相关性特性,在记录增加时,自动将新的序列号赋值给相应的字段,从而实现该字段的自动连续取值功能(自增长)。
(1)生成子的创建
Create Generator Set_SortCode;
(2)创建应用数据库表
(3)创建基于上表的触发器
以上四项工作均可在IB6.5的Interactive SQL中直接运行上述语句实现。当在DeviceBook表中进行插入操作,IB则会自动生成一个SortCode值,且不会重复。
3 测试用例
上述程序中参数ParamByName('p1').AsInteger虽然被赋值1,但在插入记录时触发器会自动取值,相应生成子自动将其修改掉,从而保证帐目分类编号与生成子的当前值一致。
但在插入过程中出现异常回滚时,笔者发现生成子仍然自动加了1,而没有回滚,这是使用IB6.5的一点遗憾。因此在异常回滚时,得重新修复一下生成子,这样才能保证编号的连续性。
4 结束语
通过生成子和触发器可以很方便地在IB6.5中实现自增长数据类型,且创建过程是一次性的,系统会自动维护,这将给程序开发和应用带来极大的便利。通过对自增变量的不同转换,可以实现诸如流水号、帐号等各种其它自动增长变量的应用。
参考文献
VC++中实现数据加密 第8篇
使用Excel制作数据库的最大好处,就是可以使用那些相当容易使用的函数了。在Excel中有很多函数,使用这些函数来编写表达式的话,可以很简洁地进行数据的输入及查找、统计及筛选等数据库处理操作。但是大部分人在使用Excel时,只是简单使用了软件菜单提供的排序、自动筛选,以及求和等数学计算函数,在处理最简单的数据表格时相当方便快捷,然而当实际工作对数据的处理提出更复杂的要求时就束手无策了,转而求助于他人或其他软件工具。本文将结合自己在工作中的实际应用,介绍能够把Excel当成数据库使用时发挥作用的函数,抛砖引玉,提供一些解决复杂数据处理问题的技巧与大家共享。
1 以VLOOKUP函数来引用数据
VLOOKUP函数可以很方便地在已输入数据的单元格中查找并引用特定的数据,不但能在添加数据时有效地减少必须要输入的项目,加快数据录入速度,还能避免输入错误,可以起到校验的作用。VLOOKUP函数的格式如下:
=VLOOKUP(查找值,查找范围,想显示的列表,[查找类型])
查找值:查找从主数据表左端列为对象的查找值
查找范围:指定主数据表的单元格范围
想显示的列标:以列标来指定要显示出被找到得记录中哪一列的值
查找类型:以逻辑值来指定是要找与查找值完全一样的内容,还是接近于该值即可。一般指定为FALSE来以完全一致的方式进行查找。
如表一所示,假设要在员工信息表中引用部分员工的某几项信息,可以在H2单元格中使用下面的表达式来直接引用数据
避免重复输入的工作量和可能出现的录入错误。
该表达式的意义为“以G2单元格的内容为参照标准在A2:E8的单元格范围内左端列中查找完全一样的记录,查到后取其第2个字段填入当前单元格”。其作用直观来说就是在H列的姓名可以不用输入,只要在G列输入或生成ID号,表达式会自动引用到正确的姓名,如果要在I列实现相似的效果,只要将表达式改为“=VLOOKUP(G2,$A$2:$E$8,5,FALSE)”即可,也就是将参数中第3项改为“5”,因为等级信息在员工信息表的第5列。
2 使用SUMPRODUCT函数进行多条件统计
日常工作中在一张数据表中利用筛选或COUNTIF()函数等进行简单的单条件统计技术很容易,可是一旦条件增多,利用筛选功能或COUNTIF()函数逐项统计手工记录就会非常繁琐。例如在学校工作中很常见的一种统计:在一张全年级混合的各科考试等级表中统计各班某科的各等级人数。这时使用SUMPRODUCT函数就可以一次性准确生成结果。
注意:参数中涉及统计范围的列的表示要用绝对引用的单元格范围来限定,如$B$2:$B$867不能使用直接的列号诸如$B:$B作为统计范围参数,否则无法得出正确结果。
SUMPRODUCT函数的基本用法是在给定的几组数组中,将数组间对应的元素相乘,并返回乘积之和。语法:
Array1,array2,array3,...为2到30个数组,其相应元素需要进行相乘并求和。
而只要理解了SUMPRODUCT函数的含义,我们完全可以提炼出专门进行多条件统计计数的固定模式,即
其结果就是统计同时满足条件1、条件2、条件3的记录的个数。
比如刚才的例子,如表2所示,为统计各班历史成绩的各等级人数,可以在I2单元格输入以下表达式
该表达式的含义为:“统计B2:B867范围内其值等于H2单元格内容的记录中,C2:C867中值等于I1单元格内容的数目。”直观来说,就是要在I2单元格里计算“班级”字段等于1的记录中“历史”字段等于“A”的记录个数,然后将该公式先向下拉自动填充,再向右拉自动填充,即可立即得出12个班5个等级历史成绩的人数,其中参数中$H2的使用使公式自动填充时参照班级相应改变为1、2、312,参数中I$1的使用使参照等级在填充时相应改变为A、B、C、D、P。
对于类似的多条件统计计数问题,都可以通过灵活改变SUMPRODUCT函数的参数高效准确的解决。
3 利用数组公式统计数据
在统计数据时,可以使用“数组公式”这种非常方便的计算方式。数组公式原本是用来将多个公式整合为一个的计算方法,不过若善加利用其特征的话,则可以让持有特定值的记录在统计时更简单。以SUM函数在数组公式中的使用为例,数组公式要用以下的形式来编写
=SUM(条件表达式*条件表达式*值的数组)
表3使用数组公式来合计年龄在20到30岁的员工的工资
其中I3单元格中输入的表达式为
特别注意:在I3单元格中输入时,是先输入表达式
然后按CTRL+SHIFT+ENTER,这样公式就会被自动加上{},被当做一个数组公式进行计算了。
现在我们对这个公式进行分解,可以看出这个公式是这样的形式:
=SUM(年龄大于20的条件表达式*年龄小于30的条件表达式*想合计起来的工资字段)
这个公式就代表了将对每一条记录(行)的条件表达式(这里是>=20和<30)结果(1或者0,满足这两个条件是1,否则0)与想要合计的字段(这里是工资字段)的值相乘,并合计其结果。由于0和任何数的乘积就是0,所以这样将只有与条件一致的记录的工资值才会被合计。
利用这样的规则,就可以使用前面的数组公式求得年龄在20到30之间的人的工资总和。类似的如果要求图书馆一级教师的工资总和,可以使用表达式
{=SUM((D3:D8="图书馆")*(E3:E8="二级")*(G3:G8))}
当要像数据库函数一样,不想用到专门用来编写筛选条件的单元格时,只要灵活运用数表2(共866人,最后一行行号867)
注意:参数中涉及统计范围的列的表示要用绝对引用的单元格范围来限定,如$B$2:$B$867不能使用直接的列号诸如$B:$B作为统计范围参数,否则无法得出正确结果。
该表达式的含义为:“统计B2:B867范围内其值等于H2单元格内容的记录中,C2:C867中值等于I1单元格内容的数目。”直观来说,就是要在I2单元格里计算“班级”字段等于1的记录中“历史”字段等于“A”的记录个数,然后将该公式先向下拉自动填充,再向右拉自动填充,即可立即得出12个班5个等级历史成绩的人数,其中参数中$H2的使用使公式自动填充时参照班级相应改变为1、2、312,参数中I$1的使用使参照等级在填充时相应改变为A、B、C、D、P。
对于类似的多条件统计计数问题,都可以通过灵活改变SUMPRODUCT函数的参数高效准确的解决。
4 利用数组公式统计数据
在统计数据时,可以使用“数组公式”这种非常方便的计算方式。数组公式原本是用来将多个公式整合为一个的计算方法,不过若善加利用其特征的话,则可以让持有特定值的记录在统计时更简单。以SUM函数在数组公式中的使用为例,数组公式要用以下的形式来编写
=SUM(条件表达式*条件表达式*值的数组)
表4使用数组公式来合计年龄在20到30岁的员工的工资
其中I3单元格中输入的表达式为
特别注意:在I3单元格中输入时,是先输入表达式
然后按CTRL+SHIFT+ENTER,这样公式就会被自动加上{},被当做一个数组公式进行计算了。
现在我们对这个公式进行分解,可以看出这个公式是这样的形式:
=SUM(年龄大于20的条件表达式*年龄小于30的条件表达式*想合计起来的工资字段)
这个公式就代表了将对每一条记录(行)的条件表达式(这里是>=20和<30)结果(1或者0,满足这两个条件是1,否则0)与想要合计的字段(这里是工资字段)的值相乘,并合计其结果。由于0和任何数的乘积就是0,所以这样将只有与条件一致的记录的工资值才会被合计。
利用这样的规则,就可以使用前面的数组公式求得年龄在20到30之间的人的工资总和。类似的如果要求图书馆一级教师的工资总和,可以使用表达式
{=SUM((D3:D8="图书馆")*(E3:E8="二级")*(G3:G8))}
当要像数据库函数一样,不想用到专门用来编写筛选条件的单元格时,只要灵活运用数组公式,就可以对符合条件的记录进行统计了。当然,除了SUM函数外,其它函数也可以使用这种数组公式的方式解决类似的统计问题。
EXCEL中提供的函数非常丰富,而且随着版本的更新,在函数功能方面已有了很大的进步和提高,如果我们能深入挖掘EX-CEL中各种函数的用法和技巧,往往可以大幅提高我们工作中对大批量数据进行处理的效率,甚至可以解决一些以往以为不能用EXCEL解决的问题。因此如何灵活运用函数在EXCEL中实现数据库应用,充分发挥出EXCEL这个简单易用的常备工具的全部作用,是一个值得我们研究的课题。
参考文献
[1]神龙工作室.Excel高效办公—vba范例应用[M].北京:人民邮电出版社,2006:90-96.
[2]李洋.Eexcel函数、图表与数据分析应用实例[M].北京:清华大学出版社,2007:150-155.
[3]薛建.Excel函数在数据处理中的若干应用[J].机电技术,2007(2).
[4]马巧娥,闫红军.Excel查找函数及其在数据管理中的应用[J].杨凌职业技术学院学报,2004(2).
[5]韩力,邓祥曜.用Excel开发MIS的方法[J].微电脑世界,1996(1).
[6]温凤兰.Excel实用经验集[J].微电脑世界,1998(23).