变相怪杰 发表于 2015-1-16 22:30:28

MSSQL编程:Win32下Foxbase+数据库扫瞄程序的编写

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

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

structFIELD_RECORD/*Thisstructureisfilledinmemory*/
{/*withafread.donotchange.*/
charname;/*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;/*reservedbydbase*/
};

structDBF
{
charfilename;/*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的拼写。

山那边是海 发表于 2015-2-28 08:48:24

对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。

金色的骷髅 发表于 2015-3-9 21:53:24

这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?

仓酷云 发表于 2015-3-23 15:53:17

无法深入到数据库系统层面去了解和探究
页: [1]
查看完整版本: MSSQL编程:Win32下Foxbase+数据库扫瞄程序的编写