数据库设计源代码.pdf

上传人:g****s 文档编号:85878168 上传时间:2023-04-13 格式:PDF 页数:65 大小:949.59KB
返回 下载 相关 举报
数据库设计源代码.pdf_第1页
第1页 / 共65页
数据库设计源代码.pdf_第2页
第2页 / 共65页
点击查看更多>>
资源描述

《数据库设计源代码.pdf》由会员分享,可在线阅读,更多相关《数据库设计源代码.pdf(65页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、 本资料为 word 版本,可以直接编辑和打印,感谢您的下载 数据库设计源代码 地点:_ 时间:_ 说明:本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容 资料范本/选择一种高级语言实现下列语句的功能。/CREATE TABLE (,)/ALTER TABLE ADD DROPMODIFY /使用说明/1、将程序文件 table.sql 放在 D 盘根目录下。/2、在 C 盘根目录下建立一个名为数据库的文件夹,用于存储表。/3、建立的表存储路径为 C:数据库:table.dbf。/4、在程序文件 t

2、able.sql 中只有一条建表语句和三条修改表语句,在以程序方式执/行时注意执行的次数,慎重选择“是否继续执行”。/5、程序输入的 SQL 语句格式如下:/create table student/(/SNO int PRIMARY KEY,/SNAME char(10)UNIQUE,/SAGE int,/SDEPT char(20)NOT NULL,/COURSE char(20),/GRADE int/);/alter table student add CNO int NOT NULL;/alter table student alter column SAGE short;/alte

3、r table student drop SDEPT;#include#include#include#include/宏定义#define YEAR 0#define MONTH 1#define DAY 2#define FOX_VERISON_INFO 262#define MAX 40/字段类型#define DATE 0 x44#define DOUBLE 0 x45#define FLOAT 0 x46#define SHORT 0 x47#define INT 0 x48#define TRUE 1#define FALSE 0/文件头结构体定义 struct DbfHead c

4、har dbFlag;char year;char month;char day;int recCounts;short firstRecAddr;short recLen;char undo20;typedef struct DbfHead DbfHead,*pDbfHead;/字段描述结构体定义 struct FieldDcp char fieldName10;char undo1;char fieldType;short offset;char undo22;char fieldLen;char numDecis;char undo314;typedef struct FieldDcp

5、FieldDcp,*pFieldDcp;/字段数据结构体定义 struct DbfField char *fieldData;char fieldName10;char fieldType;char fieldLen;char fieldDcis;short offset;typedef struct DbfField DbfField,*pDbfField;/记录结构体定义 struct DbfRec char delFlag;DbfField fieldMAX;int realCounts;typedef struct DbfRec DbfRec,*pDbfRec;/dbf 文件句柄定义

6、struct DbfHand char filename50;DbfHead header;DbfRec rec;long curRecNo;long curFpAddr;FILE *fd;typedef struct DbfHand DbfHand,*pDbfHand;/约束条件 typedef struct Condition int flag;/flag 用于区分约束条件(PARIMARY KEY 1 UNIQUE 2 NOT NULL 3)Condition;pDbfHand f;DbfRec rec;char table_name20;char sql300,sql1300;char

7、 GetDate(int getMode)/获取日期 if(DAY=getMode)return 01;if(MONTH=getMode)return 06;if(YEAR=getMode)return 10;else exit(0);short GetHeadLength(pDbfRec rec)/获得文件头长度 return rec-realCounts*32+32+2;short GetRecLength(pDbfRec rec)/获得文件体长度 register int i=0;int count=0;for(i=0;irealCounts;i+)if(rec-fieldi.field

8、Type=D)count+=8;continue;else if(rec-fieldi.fieldType=I)count+=4;continue;else if(rec-fieldi.fieldType=T)count+=6;continue;count+=rec-fieldi.fieldLen;return count+1;pDbfHand NewDbfHead(pDbfHand hand,pDbfRec rec)/新建文件头 int ret=-1;hand-header.dbFlag=0 x03;hand-header.day=GetDate(DAY);hand-header.month

9、=GetDate(MONTH);hand-header.year=GetDate(YEAR);hand-header.recLen=GetRecLength(rec);hand-header.recCounts=0;hand-header.firstRecAddr=GetHeadLength(rec);if(0!=fseek(hand-fd,0,SEEK_SET)return NULL;ret=fwrite(char*)&hand-header,sizeof(DbfHead),1,hand-fd);if(ret!=-1)return hand;else return NULL;pDbfHand

10、 UpdateHead(pDbfHand hand)/更新文件头 if(0!=fseek(hand-fd,0,SEEK_SET)return NULL;if(-1=fwrite(char*)&hand-header,sizeof(DbfHead),1,hand-fd)return NULL;fclose(hand-fd);return hand;pDbfHand WriteFieldDicsribe(pDbfHand hand,pDbfRec rec)/写字段描述部分 int i=0;FieldDcp field=0;field.offset=0 x01;for(i=0;i realCount

11、s;i+)field.fieldType=rec-fieldi.fieldType;field.numDecis=0;switch(field.fieldType)case DOUBLE:field.fieldLen=8;break;case FLOAT:field.fieldLen=4;break;case INT:field.fieldLen=4;break;case SHORT:field.fieldLen=2;break;default:field.fieldLen=rec-fieldi.fieldLen;break;strcpy(field.fieldName,rec-fieldi.

12、fieldName);field.offset+=(short)rec-fieldi.fieldLen;if(-1=fwrite(char*)&field,sizeof(FieldDcp),1,hand-fd)return NULL;hand-rec.delFlag=0 x20;hand-rec.realCounts=rec-realCounts;for(i=0;i realCounts;i+)hand-rec.fieldi=rec-fieldi;return hand;void WriteFieldEnd(pDbfHand hand)/写文件头结束标志 int i=0;char buf2=0

13、 x0D,0 x00;char versionBufFOX_VERISON_INFO=0;if(0=fseek(hand-fd,0,SEEK_END)if(-1=fwrite(buf,2,1,hand-fd)return;return;pDbfHand ReadDbfHead(pDbfHand hand)/读文件头信息 int i=0,j=0;if(-1!=(fseek(hand-fd,0,SEEK_SET)if(0!=fread(char*)&hand-header,32,1,hand-fd)return hand;return NULL;int GetFieldCount(pDbfHand

14、 hand)/得到字段个数 int i=0;int offset=1;FieldDcp field=0;char cEnd=0;for(i=0;i fd,(i+1)*32,SEEK_SET)return-1;if(0!=fread(char*)&field,32,1,hand-fd)fread(&cEnd,1,1,hand-fd);if(0 x0D=cEnd)return(i+1);return-1;pDbfHand ReadFieldDiscribe(pDbfHand hand)/读字段描述信息 int i=0,j=0;int fieldCount=GetFieldCount(hand);h

15、and-rec.realCounts=fieldCount;for(i=0;i rec.realCounts;i+)FieldDcp field=0;if(-1=fseek(hand-fd,(i+1)*32,SEEK_SET)return NULL;if(-1=fread(char*)&field,32,1,hand-fd)return NULL;memcpy(hand-rec.fieldi.fieldName,field.fieldName,sizeof(field.fieldName);hand-rec.fieldi.fieldLen=field.fieldLen;hand-rec.fie

16、ldi.fieldType=field.fieldType;hand-rec.fieldi.fieldDcis=field.numDecis;hand-rec.fieldi.offset=field.offset;for(i=0;irec.realCounts;i+)for(j=0;hand-rec.fieldi.fieldNamej!=0;j+)hand-rec.fieldi.fieldNamej=tolower(hand-rec.fieldi.fieldNamej);return hand;char*SaveDate(char*str)/保存内容为日期时,格式华 int i=0,j=0;c

17、har temp9=0;if(strlen(str)!=10)/日期格式输入不合法 return NULL;for(i=0,j=0;i=0&*(str+i)rec.realCounts;buf=(char*)malloc(hand-header.recLen+1);memset(buf,0 x20,hand-header.recLen+1);buf0=;for(i=0;i rec.fieldi.fieldType=DATE&record-fieldi.fieldData!=NULL)record-fieldi.fieldData=SaveDate(record-fieldi.fieldData

18、);curFieldLen=hand-rec.fieldi.fieldLen;actDataLen=strlen(record-fieldi.fieldData);if(actDataLen curFieldLen)actDataLen=curFieldLen;memcpy(&bufnPos,record-fieldi.fieldData,actDataLen);nPos+=hand-rec.fieldi.fieldLen;bufhand-header.recLen=0;if(-1=fwrite(buf,hand-header.recLen,1,hand-fd)rest=FALSE;retur

19、n rest;char*ReadDbfDate(char*str)/读日期时,格式化 int i=0,j=0;char temp11=0;char*strRest=NULL;for(i=0,j=0;i=0;i-)if(*(str+i)!=0 x20)break;stri=0 x00;return str;/*pDbfField GetCurrentField(pDbfHand handle,pDbfRec rec,int fieldId)/得到当前文件 return(pDbfField)&(rec-fieldfieldId);*/int GetFieldNum(pDbfHand hand,ch

20、ar*field_name)/得到文件个数 int flag=0;int j;for(j=0;jrec.realCounts;j+)if(0=strcmp(field_name,hand-rec.fieldj.fieldName)flag=1;break;if(flag)return j;else return-1;int IsBottomRecord(pDbfHand hand)/判断是否是第一条记录 int recCounts=hand-header.recCounts;if(hand-curRecNo!=hand-header.recCounts)return FALSE;return

21、TRUE;int GotoTop(pDbfHand hand)/返回顶部 hand-curRecNo=1;hand-curFpAddr=hand-header.firstRecAddr;if(-1=fseek(hand-fd,hand-curFpAddr,SEEK_SET)return FALSE;return TRUE;int GotoBottom(pDbfHand hand)/移动到最后一条记录 int recLen=hand-header.recLen;long offset=0;offset=recLen*(hand-header.recCounts-1);hand-curRecNo=

22、hand-header.recCounts;hand-curFpAddr=hand-header.firstRecAddr+offset;if(-1=fseek(hand-fd,hand-curFpAddr,SEEK_SET)return FALSE;return TRUE;int GoNextRecord(pDbfHand hand)/移动到下一条记录 if(TRUE=IsBottomRecord(hand)return TRUE;else hand-curRecNo+=1;hand-curFpAddr+=hand-header.recLen;if(-1=fseek(hand-fd,hand

23、-header.recLen,SEEK_CUR)return FALSE;return TRUE;int GetCurRecord(pDbfHand hand,pDbfRec rec)/得到当前记录 int i=0,m;char curFieldLen=0;long fieldOffset=0;char pBuffData1024=0;char*recData;(*rec)=hand-rec;for(m=0;mrec.realCounts;m+)rec-fieldm.fieldData=(char*)malloc(hand-rec.fieldm.fieldLen+1);memset(rec-f

24、ieldm.fieldData,0 x00,hand-rec.fieldm.fieldLen+1);if(-1=fseek(hand-fd,hand-curFpAddr,SEEK_SET)/Move file pointer return 0;recData=pBuffData;recData=recData+1;if(-1=fread(recData,hand-header.recLen,1,hand-fd)return 0;rec-delFlag=recData0;recData=recData+1;for(i=0;i rec.realCounts;i+,fieldOffset+=curF

25、ieldLen)curFieldLen=hand-rec.fieldi.fieldLen;memcpy(rec-fieldi.fieldData,recData+fieldOffset,curFieldLen);rec-fieldi.fieldData=DsdStrEndSpace(rec-fieldi.fieldData,curFieldLen);if(rec-fieldi.fieldType=DATE&rec-fieldi.fieldData0!=0 x20)rec-fieldi.fieldData=ReadDbfDate(rec-fieldi.fieldData);return 1;pD

26、bfHand AddRec(pDbfHand hand,pDbfRec record)/向文件尾中插入一条记录 char dataEndFlag=0 x1A;if(hand-fd=fopen(c:数据库table.dbf,r+b)=NULL)return NULL;if(hand-header.recCounts=0)fseek(hand-fd,-0L,SEEK_END);else fseek(hand-fd,-1L,SEEK_END);if(FALSE =WriteRecord(hand,record)return NULL;if(-1=fwrite(&dataEndFlag,1,1,han

27、d-fd)return NULL;hand-curRecNo+=1;hand-header.recCounts+=1;hand-curFpAddr+=hand-header.recLen;if(NULL=UpdateHead(hand)return NULL;return hand;pDbfHand AddField(pDbfHand hand,char*field_name,char type,int len,int dec)/在文件中插入一条记录 int i,reccounts;pDbfRec *rec;if(hand-header.recCounts)rec=(pDbfRec*)mall

28、oc(sizeof(pDbfRec)*hand-header.recCounts);hand-curFpAddr=hand-header.firstRecAddr;hand-curRecNo=1;if(-1=fseek(hand-fd,hand-curFpAddr,SEEK_SET)return FALSE;for(i=0;iheader.recCounts;i+)reci=(pDbfRec)malloc(sizeof(DbfRec);GetCurRecord(hand,reci);GoNextRecord(hand);for(i=0;iheader.recCounts;i+)reci-fie

29、ldhand-rec.realCounts.fieldData=(char*)malloc(len+1);memset(reci-fieldhand-rec.realCounts.fieldData,0 x00,len+1);reci-realCounts+;strcpy(hand-rec.fieldhand-rec.realCounts.fieldName,field_name);hand-rec.fieldhand-rec.realCounts.fieldNamestrlen(field_name)=0;hand-rec.fieldhand-rec.realCounts.fieldType

30、=type;hand-rec.fieldhand-rec.realCounts.fieldLen=len;hand-rec.fieldhand-rec.realCounts.fieldDcis=dec;hand-rec.realCounts+;reccounts=hand-header.recCounts;hand-fd=fopen(c:数据库table.dbf,w);fclose(hand-fd);hand-fd=fopen(c:数据库table.dbf,w+b);if(NewDbfHead(hand,&hand-rec)=NULL)return NULL;if(NULL=WriteFiel

31、dDicsribe(hand,&hand-rec)return NULL;WriteFieldEnd(hand);if(0!=fclose(hand-fd)return NULL;for(i=0;iheader.recCounts)rec=(pDbfRec*)malloc(sizeof(pDbfRec)*hand-header.recCounts);hand-curFpAddr=hand-header.firstRecAddr;hand-curRecNo=1;if(-1=fseek(hand-fd,hand-curFpAddr,SEEK_SET)return FALSE;for(i=0;ihe

32、ader.recCounts;i+)reci=(pDbfRec)malloc(sizeof(DbfRec);GetCurRecord(hand,reci);GoNextRecord(hand);reci-fieldnum.fieldDcis=dec;reci-fieldnum.fieldLen=len;reci-fieldnum.fieldType=type;hand-rec.fieldnum.fieldType=type;hand-rec.fieldnum.fieldLen=len;hand-rec.fieldnum.fieldDcis=dec;reccounts=hand-header.r

33、ecCounts;hand-fd=fopen(c:数据库table.dbf,w);fclose(hand-fd);hand-fd=fopen(c:数据库table.dbf,w+b);if(NewDbfHead(hand,&hand-rec)=NULL)return NULL;if(NULL=WriteFieldDicsribe(hand,&hand-rec)return NULL;WriteFieldEnd(hand);if(0!=fclose(hand-fd)return NULL;for(i=0;iheader.recCounts)rec=(pDbfRec*)malloc(sizeof(p

34、DbfRec)*hand-header.recCounts);hand-curFpAddr=hand-header.firstRecAddr;hand-curRecNo=1;if(-1=fseek(hand-fd,hand-curFpAddr,SEEK_SET)return FALSE;for(i=0;iheader.recCounts;i+)reci=(pDbfRec)malloc(sizeof(DbfRec);GetCurRecord(hand,reci);GoNextRecord(hand);reci-fieldnum.fieldDcis=reci-fieldnum+1.fieldDci

35、s;reci-fieldnum.fieldLen=reci-fieldnum+1.fieldLen;reci-fieldnum.fieldType=reci-fieldnum+1.fieldType;num+;if(num=-1)for(j=0;jrec.fieldnum.fieldNamej=0;hand-rec.fieldnum.fieldType=0;hand-rec.fieldnum.fieldLen=0;hand-rec.fieldnum.fieldDcis=0;else for(;numrec.fieldnum.fieldName,hand-rec.fieldnum+1.field

36、Name);hand-rec.fieldnum.fieldType=hand-rec.fieldnum+1.fieldType;hand-rec.fieldnum.fieldLen=hand-rec.fieldnum+1.fieldLen;hand-rec.fieldnum.fieldDcis=hand-rec.fieldnum+1.fieldDcis;hand-header.recCounts-;reccounts=hand-header.recCounts;hand-fd=fopen(c:数据库table.dbf,w);fclose(hand-fd);hand-fd=fopen(c:数据库

37、table.dbf,w+b);if(NewDbfHead(hand,&hand-rec)=NULL)return NULL;if(NULL=WriteFieldDicsribe(hand,&hand-rec)return NULL;WriteFieldEnd(hand);if(0!=fclose(hand-fd)return NULL;for(i=0;ifd=fopen(c:数据库table.dbf,w+b)!=NULL)if(NewDbfHead(hand,&rec)=NULL)return NULL;if(NULL=WriteFieldDicsribe(hand,&rec)return N

38、ULL;WriteFieldEnd(hand);fclose(hand-fd);return hand;pDbfHand OpenDbf()/打开 DBF 文件 pDbfHand hand=NULL;if(hand=(pDbfHand)malloc(sizeof(DbfHand)=NULL)return NULL;memset(hand,0 x00,sizeof(DbfHand);if(hand-fd=fopen(c:数据库table.dbf,r+b)=NULL)return NULL;if(NULL=ReadDbfHead(hand)return NULL;if(NULL=ReadField

39、Discribe(hand)return NULL;GotoTop(hand);return hand;void ShowBeginning()printf(+-+n);printf(|n);printf(|欢迎进入 SQL 系统|n);printf(|n);printf(+-+n);void Show()printf(输入语句格式如下:n);printf(create table studentn);printf(n);printf(SNO int PRIMARY KEY,n);printf(SNAME char(10)UNIQUE,n);printf(SAGE int,n);printf(

40、SDEPT char(20)NOT NULL,n);printf(COURSE char(20),n);printf(GRADE intn);printf();n);printf(alter table student add CNO int NOT NULL;n);printf(alter table student alter column SAGE short;n);printf(alter table student drop SDEPT;n);int Read()/用于读取从键盘键入的 SQL 语句 char c;int i,j;printf(+n);printf(请输入 SQL 语

41、句:nn);for(i=0;(c=getch()!=;i+)if(c=27)exit(0);if(c=8)i-=2;if(i-1)i=-1;system(cls);Show();printf(+n);printf(请输入 SQL 语句:nn);for(j=0;j=i;j+)if(sql1j=13)puts();printf(%c,sql1j);continue;sql1i=c;if(c=13)puts();sqli=;else if(c=(|c=)|c=)printf(%c,c);sqli=;else printf(%c,c);sqli=c;sqli=;sqli+1=0;printf(;);p

42、uts();return 0;int position;/文件指针的位置 int Read1()/用于读取从程序文件中读取的 SQL 语句 FILE*fp;char c;int i,j;printf(+n);printf(请输入 SQL 语句:nn);fp=fopen(d:table.sql,r);fseek(fp,position,0);for(i=0;(c=fgetc(fp)!=;i+)if(c=27)exit(0);if(c=8)i-=2;if(i-1)i=-1;system(cls);Show();printf(+n);printf(请输入 SQL 语句:nn);for(j=0;j=i

43、;j+)if(sql1j=13)puts();printf(%c,sql1j);continue;sql1i=c;if(c=13)puts();sqli=;else if(c=(|c=)|c=)printf(%c,c);sqli=;else printf(%c,c);sqli=c;sqli=;sqli+1=0;printf(;);puts();position=ftell(fp);return 0;int CREATE()char type610=char,int,short,float,double;char Type16=C,N,S,F,D;FILE*fp=NULL;Condition c

44、onMAX;/约束条件结构体 int i,j,num=0,error=1;/num 字段数 error 输入错误标志 char temp10,condition10;/table_name 表名 condition 约束条件 memset(con,0,sizeof(con0)*MAX);/结构体中各值初始化为空 for(i=0;sqli=;i+);for(j=0;sqli!=&sqli!=;i+,j+)tempj=tolower(sqli);tempj=0;if(strcmp(temp,create)!=0)/判断 create 是否写错 error=0;printf(n 你输入的create

45、有误,请重新创建!n);else for(;sqli=;i+);for(j=0;sqli!=&sqli!=;i+,j+)tempj=tolower(sqli);tempj=0;if(strcmp(temp,table)!=0)/判断 table 是否写错 error=0;printf(n 你输入的table有误,请重新创建!n);else for(;sqli=;i+);for(j=0;sqli!=&sqli!=;i+,j+)/提取表名 table_namej=tolower(sqli);table_namej=.;/加后缀.dbf table_namej+1=d;table_namej+2=b

46、;table_namej+3=f;table_namej+4=0;do int field_lengtf=0,flag=1;/field_lengtf 字段长度 for(;sqli=|sqli=,;i+);if(sqli=;)break;for(j=0;sqli!=;i+,j+)/提取列名 rec.fieldnum.fieldNamej=sqli;rec.fieldnum.fieldNamej=0;for(;sqli=;i+);for(j=0;sqli!=&sqli!=,;i+,j+)/提取列数据类型 tempj=tolower(sqli);tempj=0;for(j=0;j5;j+)if(s

47、trcmp(temp,typej)=0)rec.fieldnum.fieldType=Type1j;break;if(j=5)/列数据类型有误 error=0;printf(n 你输入的列数据类型有误(务必是char,int,short,float,double),请重新创建!n);break;else /*+*/if(rec.fieldnum.fieldType=C)/如果类型是 char 需要提取列长度,如果是 int、float 则固定列长度为4,double 则固定列长度为 8 for(;sqli=;i+);for(;sqli!=;i+)/提取长度 if(sqli58)/列长度必须是数

48、字 flag=0;break;else field_lengtf=field_lengtf*10+(sqli-48);if(flag=0)error=0;printf(n 你输入的列长度有误,请重新创建!n);break;else rec.fieldnum.fieldLen=field_lengtf;else if(rec.fieldnum.fieldType=N|rec.fieldnum.fieldType=F)rec.fieldnum.fieldLen=4;else if(rec.fieldnum.fieldType=D)rec.fieldnum.fieldLen=8;else if(re

49、c.fieldnum.fieldType=S)rec.fieldnum.fieldLen=2;field_lengtf=0,flag=1;for(;sqli=;i+);for(j=0;sqli!=&sqli!=,&sqli!=;i+,j+)/提取列完整性约束 conditionj=tolower(sqli);conditionj=0;if(condition0!=,&condition0!=0)if(strcmp(condition,primary)=0)/判断是否为主键 for(;sqli=;i+);for(j=0;sqli!=&sqli!=,;i+,j+)tempj=tolower(sql

50、i);tempj=0;if(strcmp(temp,key)=0)connum.flag=1;else error=0;printf(n 你输入的KEY有误,请重新创建!n);break;else if(strcmp(condition,unique)=0)/判断是否取唯一值 connum.flag=2;else if(strcmp(condition,not)=0)/判断是否非空 for(;sqli=;i+);for(j=0;sqli!=&sqli!=,;i+,j+)conditionj=tolower(sqli);conditionj=0;if(strcmp(condition,null)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 文案大全

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com