仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 793|回复: 6
打印 上一主题 下一主题

[学习教程] MSSQL编程:Win32下Foxbase+数据库扫瞄程序的编写

[复制链接]
变相怪杰 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:30:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
对于update操作,只需要把event中的旧行和新行值对调即可。程序|数据|数据库
1、目标
硬件:CPU(Cyrix200MHz),内存16M,硬盘4G
请求:在WINDOWS98的资本办理器中鼠标双击任何一个Foxbase+数据库文件图标(每一个文件数据纪录在一万条以下),程序翻开数据库文件并显现数据库内容。

2、步骤
Foxbase+数据库文件格局(参照MarkSadler的文件格局申明和响应C言语源程叙文件)
编程中产生的成绩:
以下是MarkSadler的DBF.H文件部份内容:
typedefunsignedcharUCHAR;

structFIELD_RECORD/*Thisstructureisfilledinmemory*/
{/*withafread.donotchange.*/
charname[11];/*nameoffieldinasciz*/
chartyp;/*typeoffield...char,numericetc.*/
char*field_data_address;/*offsetoffieldinrecord*/
#ifdefined(__TINY__)||defined(__SMALL__)||defined(__MEDIUM__)
intspace_holder;/*field_data_addressmustbe32bits*/
#endif
UCHARlen;/*lengthoffield*/
UCHARdec;/*decimalsinfield*/
UCHARreserved_bytes[14];/*reservedbydbase*/
};

structDBF
{
charfilename[MAXPATH];/*dosfilename*/
FILE*file_ptr;/*cfilepointer*/
unsignedlongintcurrent_record;/*currentrecordinmemory*/
enum/*statusoffile*/
{
not_open=0,
not_updated,
updated
}status;
UCHARnum_fields;/*numberoffields*/

/*thefollowing7variablesarefilledwithafread,donotchangeorderorsize*/
UCHARdbf_version;/*versioncharacter*/
UCHARupdate_yr;/*dateoflastupdate-year(-1900)*/
UCHARupdate_mo;/*dateoflastupdate-month*/
UCHARupdate_day;/*dateoflastupdate-day*/
unsignedlongintrecords;/*numberofrecordsindbf*/
unsignedintheader_length;/*lengthofheaderstructure*/
unsignedintrecord_length;/*lengthofarecord*/
/**/
structFIELD_RECORD*fields_ptr;/*pointertofieldarray*/
char*record_ptr;/*pointertocurrentrecordstruct*/
};

intd_addrec(structDBF*d);
intd_blank(structDBF*d);
intd_close(structDBF*d);
intd_cpystr(structDBF*s,structDBF*d);
chard_getfld(structDBF*d,intf,char*buff);
intd_getrec(structDBF*d,unsignedlongintr);
intd_open(structDBF*d);
intd_putfld(structDBF*d,intf,char*buff);
intd_putrec(structDBF*d,unsignedlongintr);

以上材料中供应的函数都供应了源程序,固然年夜部分都是利用ANSIC,但倒是针对DOS体例下的。如更新日期:
inregs.h.ah=0x2a;
intdos(&inregs,&outregs);
d->update_day=outregs.h.dl;
d->update_mo=outregs.h.dh;
d->update_yr=outregs.x.cx-1900;
这明显在Win32下没法编译经由过程。但在DOS下完整能够编译经由过程,并正确地读出各笔记录信息。
修正以上各函数,使之切合WIN32特性,编译经由过程。
运转程序,发明没法准确显现数据库内容。
因为函数完成部分已全体修正为Win32能够承受的情势,没甚么成绩,只要反省DBF.H。
DOS的int与char一样为8bit,而WIN32中,int为32bit,Smallint为8bit。
修正DBF.h文件,将struct中一切的int改成Smallint,longint改成int。
编译经由过程,程序能一般运转。
3、总结
在WIN32相沿DOS体例下的C程序时,要出格注重分歧平台下的区分。
以上程序还可得当增强,如:读进各项数据时应新建一线程,并增添一进度条显现数据库文件读进情形,再编写一些函数(如Find、Delete等),增添一些功效,使程序加倍完善。
本文是几年前所作,但愿对初学者有所匡助。
这里我们讨论用binlog来实现闪回的方案。
冷月葬花魂 该用户已被删除
沙发
发表于 2015-1-25 23:39:45 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
灵魂腐蚀 该用户已被删除
板凳
发表于 2015-2-4 13:26:08 | 只看该作者
以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了
老尸 该用户已被删除
地板
发表于 2015-2-9 23:41:08 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
山那边是海 该用户已被删除
5#
发表于 2015-2-28 08:48:24 | 只看该作者
对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。
金色的骷髅 该用户已被删除
6#
发表于 2015-3-9 21:53:24 | 只看该作者
这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?
7#
发表于 2015-3-23 15:53:17 | 只看该作者
无法深入到数据库系统层面去了解和探究
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 12:39

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表