数据库设计源代码.docx
- 文档编号:9881606
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:61
- 大小:26.58KB
数据库设计源代码.docx
《数据库设计源代码.docx》由会员分享,可在线阅读,更多相关《数据库设计源代码.docx(61页珍藏版)》请在冰豆网上搜索。
数据库设计源代码
//选择一种高级语言实现下列语句的功能。
//CREATETABLE<表名> (<列名><数据类型>[<列完整性约束条件>][,<列名><数据//类型>[<列完整性约束条件>]…][,<表完整性约束条件>])
//ALTERTABLE<表名>[ADD<新列名><数据类型>[<列完整性约束>]][DROP<列完整//性约束名>][MODIFY<列名><数据类型>]
//使用说明
//1、将程序文件table.sql放在D盘根目录下。
//2、在C盘根目录下建立一个名为"数据库"的文件夹,用于存储表。
//3、建立的表存储路径为C:
\数据库:
\table.dbf。
//4、在程序文件table.sql中只有一条建表语句和三条修改表语句,在以程序方式执//行时注意执行的次数,慎重选择“是否继续执行”。
//5、程序输入的SQL语句格式如下:
//createtablestudent
//(
//SNOintPRIMARYKEY,
//SNAMEchar(10)UNIQUE,
//SAGEint,
//SDEPTchar(20)NOTNULL,
//COURSEchar(20),
//GRADEint
//);
//altertablestudentaddCNOintNOTNULL;
//altertablestudentaltercolumnSAGEshort;
//altertablestudentdropSDEPT;
#include
#include
#include
#include
//宏定义
#defineYEAR0
#defineMONTH1
#defineDAY2
#defineFOX_VERISON_INFO262
#defineMAX40
//字段类型
#defineDATE0x44
#defineDOUBLE0x45
#defineFLOAT0x46
#defineSHORT0x47
#defineINT0x48
#defineTRUE1
#defineFALSE0
//文件头结构体定义
structDbfHead
{
chardbFlag;
charyear;
charmonth;
charday;
intrecCounts;
shortfirstRecAddr;
shortrecLen;
charundo[20];
};
typedefstructDbfHeadDbfHead,*pDbfHead;
//字段描述结构体定义
structFieldDcp
{
charfieldName[10];
charundo1;
charfieldType;
shortoffset;
charundo2[2];
charfieldLen;
charnumDecis;
charundo3[14];
};
typedefstructFieldDcpFieldDcp,*pFieldDcp;
//字段数据结构体定义
structDbfField
{
char*fieldData;
charfieldName[10];
charfieldType;
charfieldLen;
charfieldDcis;
shortoffset;
};
typedefstructDbfFieldDbfField,*pDbfField;
//记录结构体定义
structDbfRec
{
chardelFlag;
DbfFieldfield[MAX];
intrealCounts;
};
typedefstructDbfRecDbfRec,*pDbfRec;
//dbf文件句柄定义
structDbfHand
{
charfilename[50];
DbfHeadheader;
DbfRecrec;
longcurRecNo;
longcurFpAddr;
FILE*fd;
};
typedefstructDbfHandDbfHand,*pDbfHand;
//约束条件
typedefstructCondition
{
intflag;//flag用于区分约束条件(PARIMARYKEY1UNIQUE2NOTNULL3)
}Condition;
pDbfHandf;
DbfRecrec;
chartable_name[20];
charsql[300],sql1[300];
charGetDate(intgetMode)//获取日期
{
if(DAY==getMode)
return01;
if(MONTH==getMode)
return06;
if(YEAR==getMode)
return10;
else
exit(0);
}
shortGetHeadLength(pDbfRecrec)//获得文件头长度
{
returnrec->realCounts*32+32+2;
}
shortGetRecLength(pDbfRecrec)//获得文件体长度
{
registerinti=0;
intcount=0;
for(i=0;i
{
if(rec->field[i].fieldType=='D')
{
count+=8;
continue;
}
elseif(rec->field[i].fieldType=='I')
{
count+=4;
continue;
}
elseif(rec->field[i].fieldType=='T')
{
count+=6;
continue;
}
count+=rec->field[i].fieldLen;
}
returncount+1;
}
pDbfHandNewDbfHead(pDbfHandhand,pDbfRecrec)//新建文件头
{
intret=-1;
hand->header.dbFlag=0x03;
hand->header.day=GetDate(DAY);
hand->header.month=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))
returnNULL;
ret=fwrite((char*)&hand->header,sizeof(DbfHead),1,hand->fd);
if(ret!
=-1)
returnhand;
else
returnNULL;
}
pDbfHandUpdateHead(pDbfHandhand)//更新文件头
{
if(0!
=fseek(hand->fd,0,SEEK_SET))
returnNULL;
if(-1==fwrite((char*)&hand->header,sizeof(DbfHead),1,hand->fd))
returnNULL;
fclose(hand->fd);
returnhand;
}
pDbfHandWriteFieldDicsribe(pDbfHandhand,pDbfRecrec)//写字段描述部分
{
inti=0;
FieldDcpfield={0};
field.offset=0x01;
for(i=0;i
{
field.fieldType=rec->field[i].fieldType;
field.numDecis=0;
switch(field.fieldType)
{
caseDOUBLE:
field.fieldLen=8;
break;
caseFLOAT:
field.fieldLen=4;
break;
caseINT:
field.fieldLen=4;
break;
caseSHORT:
field.fieldLen=2;
break;
default:
field.fieldLen=rec->field[i].fieldLen;
break;
}
strcpy(field.fieldName,rec->field[i].fieldName);
field.offset+=(short)rec->field[i].fieldLen;
if(-1==fwrite((char*)&field,sizeof(FieldDcp),1,hand->fd))
returnNULL;
}
hand->rec.delFlag=0x20;
hand->rec.realCounts=rec->realCounts;
for(i=0;i
hand->rec.field[i]=rec->field[i];
returnhand;
}
voidWriteFieldEnd(pDbfHandhand)//写文件头结束标志
{
inti=0;
charbuf[2]={0x0D,0x00};
charversionBuf[FOX_VERISON_INFO]={0};
if(0==fseek(hand->fd,0,SEEK_END))
{
if(-1==fwrite(buf,2,1,hand->fd))
return;
}
return;
}
pDbfHandReadDbfHead(pDbfHandhand)//读文件头信息
{
inti=0,j=0;
if(-1!
=(fseek(hand->fd,0,SEEK_SET)))
{
if(0!
=fread((char*)&hand->header,32,1,hand->fd))
returnhand;
}
returnNULL;
}
intGetFieldCount(pDbfHandhand)//得到字段个数
{
inti=0;
intoffset=1;
FieldDcpfield={0};
charcEnd=0;
for(i=0;i { memset((char*)&field,0,sizeof(FieldDcp)); if(-1==fseek(hand->fd,(i+1)*32,SEEK_SET)) return-1; if(0! =fread((char*)&field,32,1,hand->fd)) { fread(&cEnd,1,1,hand->fd); if(0x0D==cEnd) return(i+1); } } return-1; } pDbfHandReadFieldDiscribe(pDbfHandhand)//读字段描述信息 { inti=0,j=0; intfieldCount=GetFieldCount(hand); hand->rec.realCounts=fieldCount; for(i=0;i { FieldDcpfield={0}; if(-1==fseek(hand->fd,(i+1)*32,SEEK_SET)) returnNULL; if(-1==fread((char*)&field,32,1,hand->fd)) returnNULL; memcpy(hand->rec.field[i].fieldName,field.fieldName,sizeof(field.fieldName)); hand->rec.field[i].fieldLen=field.fieldLen; hand->rec.field[i].fieldType=field.fieldType; hand->rec.field[i].fieldDcis=field.numDecis; hand->rec.field[i].offset=field.offset; } for(i=0;i { for(j=0;hand->rec.field[i].fieldName[j]! ='\0';j++) { hand->rec.field[i].fieldName[j]=tolower(hand->rec.field[i].fieldName[j]); } } returnhand; } char*SaveDate(char*str)//保存内容为日期时,格式华 { inti=0,j=0; chartemp[9]={0}; if(strlen(str)! =10)//日期格式输入不合法 returnNULL; for(i=0,j=0;i<10;i++) { if(i==4||i==7) continue; else { if(*(str+i)>='0'&&*(str+i)<='9') { temp[j]=*(str+i); j++; } else returnNULL; } } str=NULL; str=(char*)realloc(str,8); memset(str,0x00,8); memcpy(str,temp,8); returnstr; } intWriteRecord(pDbfHandhand,pDbfRecrecord)//在当前位置写一条纪录,覆盖原有内容 { inti=0; char*buf=NULL; intcurFieldLen=0; intactDataLen=0; intnPos=1; intnFiledCount=0; intrest=TRUE; nFiledCount=hand->rec.realCounts; buf=(char*)malloc(hand->header.recLen+1); memset(buf,0x20,hand->header.recLen+1); buf[0]=''; for(i=0;i { if(hand->rec.field[i].fieldType==DATE&&record->field[i].fieldData! =NULL) record->field[i].fieldData=SaveDate(record->field[i].fieldData); curFieldLen=hand->rec.field[i].fieldLen; actDataLen=strlen(record->field[i].fieldData); if(actDataLen>curFieldLen) actDataLen=curFieldLen; memcpy(&buf[nPos],record->field[i].fieldData,actDataLen); nPos+=hand->rec.field[i].fieldLen; } buf[hand->header.recLen]='\0'; if(-1==fwrite(buf,hand->header.recLen,1,hand->fd)) rest=FALSE; returnrest; } char*ReadDbfDate(char*str)//读日期时,格式化 { inti=0,j=0; chartemp[11]={0}; char*strRest=NULL; for(i=0,j=0;i<8;i++,j++) { if(i==4||i==6) { temp[j]='/'; j++; } temp[j]=*(str+i); } str=(char*)calloc(11,sizeof(char)); memset(str,0x00,11); memcpy(str,temp,10); returnstr; } char*DsdStrEndSpace(char*str,intsize)//去掉字符串的后面空格 { inti=0,flag=0; for(i=size-1;i>=0;i--) { if(*(str+i)! =0x20) break; str[i]=0x00; } returnstr; } /*pDbfFieldGetCurrentField(pDbfHandhandle,pDbfRecrec,intfieldId)//得到当前文件 { return(pDbfField)&(rec->field[fieldId]); }*/ intGetFieldNum(pDbfHandhand,char*field_name)//得到文件个数 { intflag=0; intj; for(j=0;j { if(0==strcmp(field_name,hand->rec.field[j].fieldName)) { flag=1; break; } } if(flag) returnj; else return-1; } intIsBottomRecord(pDbfHandhand)//判断是否是第一条记录 { intrecCounts=hand->header.recCounts; if(hand->curRecNo! =hand->header.recCounts) returnFALSE; returnTRUE; } intGotoTop(pDbfHandhand)//返回顶部 { hand->curRecNo=1; hand->curFpAddr=hand->header.firstRecAddr; if(-1==fseek(hand->fd,hand->curFpAddr,SEEK_SET)) returnFALSE; returnTRUE; } intGotoBottom(pDbfHandhand)//移动到最后一条记录 { intrecLen=hand->header.recLen; longoffset=0; offset=recLen*(hand->header.recCounts-1); hand->curRecNo=hand->header.recCounts; hand->curFpAddr=hand->header.firstRecAddr+offset; if(-1==fseek(hand->fd,hand->curFpAddr,SEEK_SET)) returnFALSE; returnTRUE; } intGoNextRecord(pDbfHandhand)//移动到下一条记录 { if(TRUE==IsBottomRecord(hand)) returnTRUE; else { hand->curRecNo+=1; hand->curFpAddr+=hand->header.recLen; if(-1==fseek(hand->fd,hand->header.recLen,SEEK_CUR)) returnFALSE; } returnTRUE; } intGetCurRecord(pDbfHandhand,pDbfRecrec)//得到当前记录 { inti=0,m; charcurFieldLen=0; longfieldOffset=0; charpBuffData[1024]={0}; char*recData; (*rec)=hand->rec; for(m=0;m { rec->field[m].fieldData=(char*)malloc(hand->rec.field[m].fieldLen+1); memset(rec->field[m].fieldData,0x00,hand->rec.field[m].fieldLen+1); } if(-1==fseek(hand->fd,hand->curFpAddr,SEEK_SET))//Movefilepointer r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 设计 源代码