![数据库设计源代码_第1页](http://file4.renrendoc.com/view/70c7ef23ebfed675eb1aea73416b98fb/70c7ef23ebfed675eb1aea73416b98fb1.gif)
![数据库设计源代码_第2页](http://file4.renrendoc.com/view/70c7ef23ebfed675eb1aea73416b98fb/70c7ef23ebfed675eb1aea73416b98fb2.gif)
![数据库设计源代码_第3页](http://file4.renrendoc.com/view/70c7ef23ebfed675eb1aea73416b98fb/70c7ef23ebfed675eb1aea73416b98fb3.gif)
![数据库设计源代码_第4页](http://file4.renrendoc.com/view/70c7ef23ebfed675eb1aea73416b98fb/70c7ef23ebfed675eb1aea73416b98fb4.gif)
![数据库设计源代码_第5页](http://file4.renrendoc.com/view/70c7ef23ebfed675eb1aea73416b98fb/70c7ef23ebfed675eb1aea73416b98fb5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
资料范本本资料为word版本,可以直接编辑和打印,感谢您的下载数据库设计源代码地点: 时间: 说明:本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容〃选择一种高级语言实现下列语句的功能。//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<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>//宏定义#defineYEAR0#defineMONTH1#defineDAY2#defineFOX_VERISON_INFO262#defineMAX40〃字段类型TOC\o"1-5"\h\z#define DATE 0x44#define DOUBLE 0x45#define FLOAT 0x46#define SHORT 0x47#define INT 0x48#define TRUE 1#define FALSE 0〃文件头结构体定义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;elseexit(0);}shortGetHeadLength(pDbfRecrec)//获得文件头长度(returnrec->realCounts*32+32+2;}shortGetRecLength(pDbfRecrec)//获得文件体长度registerinti=0;intcount=0;for(i=0;i<rec->realCounts;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;elsereturnNULL;}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<rec->realCounts;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<rec->realCounts;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<MAX;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<hand->rec.realCounts;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<hand->rec.realCounts;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++;}elsereturnNULL;}}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);buf=memset(buf,0x20,hand->header.recLen+1);buf[0]='';for(i=0;i<nFiledCount;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<hand->rec.realCounts;j++)(if(0==strcmp(field_name,hand->rec.field[j].fieldName))(flag=1;break;}}if(flag)returnj;elsereturn-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<hand->rec.realCounts;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))//Movefilepointerreturn0;recData=pBuffData;recData=recData+1;if(-1==fread(recData,hand->header.recLen,1,hand->fd))return0;rec->delFlag=recData[0];recData=recData+1;for(i=0;i<hand->rec.realCounts;i++,fieldOffset+=curFieldLen)(curFieldLen=hand->rec.field[i].fieldLen;memcpy(rec->field[i].fieldData,recData+fieldOffset,curFieldLen);rec->field[i].fieldData=DsdStrEndSpace(rec->field[i].fieldData,curFieldLen);if(rec->field[i].fieldType==DATE&&rec->field[i].fieldData[0]!=0x20)rec->field[i].fieldData=ReadDbfDate(rec->field[i].fieldData);}return1;}pDbfHandAddRec(pDbfHandhand,pDbfRecrecord)//向文件尾中插入一条记录(chardataEndFlag=0x1A;if((hand->fd=fopen("c:\\数据库\\table.dbf〃,〃r+b〃))==NULL)returnNULL;if(hand->header.recCounts==0)fseek(hand->fd,-0L,SEEK_END);elsefseek(hand->fd,-1L,SEEK_END);if(FALSE==WriteRecord(hand,record))returnNULL;if(-1==fwrite(&dataEndFlag,1,1,hand->fd))returnNULL;hand->curRecNo+=1;hand->header.recCounts+=1;hand->curFpAddr+=hand->header.recLen;if(NULL==UpdateHead(hand))returnNULL;returnhand;}pDbfHandAddField(pDbfHandhand,char*field_name,chartype,intlen,intdec)//在文件中插入一条记录(inti,reccounts;pDbfRec*rec;if(hand->header.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))returnFALSE;for(i=0;i<hand->header.recCounts;i++)(rec[i]=(pDbfRec)malloc(sizeof(DbfRec));GetCurRecord(hand,rec[i]);GoNextRecord(hand);}for(i=0;i<hand->header.recCounts;i++)(rec[i]->field[hand->rec.realCounts].fieldData=(char*)malloc(len+1);memset(rec[i]->field[hand->rec.realCounts].fieldData,0x00,len+1);rec[i]->realCounts++;}}strcpy(hand->rec.field[hand->rec.realCounts].fieldName,field_name);hand->rec.field[hand->rec.realCounts].fieldName[strlen(field_name)]='\0';hand->rec.field[hand->rec.realCounts].fieldType二type;hand->rec.field[hand->rec.realCounts].fieldLen=len;hand->rec.field[hand->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)returnNULL;if(NULL==WriteFieldDicsribe(hand,&hand->rec))returnNULL;WriteFieldEnd(hand);if(0!=fclose(hand->fd))returnNULL;for(i=0;i<reccounts;i++)AddRec(hand,rec[i]);returnhand;}pDbfHandAlterField(pDbfHandhand,char*field_name,chartype,intlen,intdec)//修改一条记录(intnum,i,reccounts;pDbfRec*rec;num二GetFieldNum(hand,field_name);if(hand->header.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))returnFALSE;for(i=0;i<hand->header.recCounts;i++)(rec[i]=(pDbfRec)malloc(sizeof(DbfRec));GetCurRecord(hand,rec[i]);GoNextRecord(hand);rec[i]->field[num].fieldDcis二dec;rec[i]->field[num].fieldLen=len;rec[i]->field[num].fieldType二type;}}hand->rec.field[num].fieldType二type;hand->rec.field[num].fieldLen=len;hand->rec.field[num].fieldDcis二dec;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)returnNULL;if(NULL==WriteFieldDicsribe(hand,&hand->rec))returnNULL;WriteFieldEnd(hand);if(0!=fclose(hand->fd))returnNULL;for(i=0;i<reccounts;i++)AddRec(hand,rec[i]);returnhand;}pDbfHandDropField(pDbfHandhand,char*field_name,intn)//删除一条记录(intnum,i,j,reccounts;pDbfRec*rec;num二GetFieldNum(hand,field_name);if(hand->header.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))returnFALSE;for(i=0;i<hand->header.recCounts;i++)rec[i]=(pDbfRec)malloc(sizeof(DbfRec));GetCurRecord(hand,rec[i]);GoNextRecord(hand);rec[i]->field[num].fieldDcis=rec[i]->field[num+1].fieldDcis;rec[i]->field[num].fieldLen=rec[i]->field[num+1].fieldLen;rec[i]->field[num].fieldType=rec[i]->field[num+1].fieldType;num++;}}if(num==-1)(for(j=0;j<10;j++)hand->rec.field[num].fieldName[j]=0;hand->rec.field[num].fieldType=0;hand->rec.field[num].fieldLen=0;hand->rec.field[num].fieldDcis=0;}else(for(;num<n;num++)(strcpy(hand->rec.field[num].fieldName,hand->rec.field[num+1].fieldName);hand->rec.field[num].fieldType二hand->rec.field[num+1].fieldType;hand->rec.field[num].fieldLen二hand->rec.field[num+1].fieldLen;hand->rec.field[num].fieldDcis二hand->rec.field[num+1].fieldDcis;}}hand->header.recCounts--;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)returnNULL;if(NULL==WriteFieldDicsribe(hand,&hand->rec))returnNULL;WriteFieldEnd(hand);if(0!=fclose(hand->fd))returnNULL;for(i=0;i<reccounts;i++)AddRec(hand,rec[i]);returnhand;}pDbfHandCreateDbf(DbfRecrec)//建立DBF文件(pDbfHandhand=NULL;if((hand=(pDbfHand)malloc(sizeof(DbfHand)))==NULL)returnNULL;memset(hand,0x00,sizeof(DbfHand));if((hand->fd=fopen("c:\\数据库\\table.dbf〃,〃w+b〃))!=NULL)(if(NewDbfHead(hand,&rec)==NULL)returnNULL;if(NULL==WriteFieldDicsribe(hand,&rec))returnNULL;WriteFieldEnd(hand);}fclose(hand->fd);returnhand;}pDbfHandOpenDbf()//打开DBF文件(pDbfHandhand=NULL;if((hand=(pDbfHand)malloc(sizeof(DbfHand)))==NULL)returnNULL;memset(hand,0x00,sizeof(DbfHand));if((hand->fd=fopen("c:\\数据库\\table.dbf〃,〃r+b〃))==NULL)returnNULL;if(NULL==ReadDbfHead(hand))returnNULL;if(NULL==ReadFieldDiscribe(hand))returnNULL;GotoTop(hand);returnhand;}voidShowBeginning()(printf(〃+ +\n");printf("|l\n");printf("| 欢迎进入SQL系统l\n");printf("||\n");printf("+ +\n");}voidShow()(printf("输入语句格式如下:\n〃);printf("createtablestudent\n");printf("(\n");printf("SNOintPRIMARYKEY,\n");printf("SNAMEchar(10)UNIQUE,\n〃);printf("SAGEint,\n〃);printf("SDEPTchar(20)NOTNULL,\n")printf("COURSEchar(20),\n〃);printf("GRADEint\n");printf(" );\n");printf(" alter table student addCNOintNOTNULL;\n");printf(" alter table student altercolumnSAGE short;\n");printf(" alter table student dropSDEPT;\n");}intRead()//用于读取从键盘键入的SQL语句(charc;inti,j;printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n〃);printf("请输入SQL语句:\n\n");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语句:\n\n");for(j=0;j<=i;j++)(if(sql1[j]==13)(puts(〃〃);}printf("%c",sql1[j]);}continue;}sql1[i]=c;if(c==13)(puts(〃〃);sql[i]='';}elseif(c=二,(,||c=二,),||c=二,\,,)(printf("%c",c);sql[i]=,,;}else(printf("%c",c);sql[i]=c;}}sql[i]=’;’;sql[i+1]='\0';printf(〃;〃);puts(〃〃);return0;}intposition;//文件指针的位置intRead1()//用于读取从程序文件中读取的SQL语句(FILE*fp;charc;inti,j;printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");printf("请输入SQL语句:\n\n");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语句:\n\n");for(j=0;j<=i;j++)(if(sql1[j]==13)puts(〃〃);printf("%c",sql1[j]);}continue;}sql1[i]=c;if(c==13)(puts(〃〃);sql[i]='';}elseif(c=二,(,||c=二,),||c=二,\,,)printf("%c",c);sql[i]=’’;}else(printf("%c",c);sql[i]=c;}}sql[i]=’;’;sql[i+1]='\0';printf(〃;〃);puts(〃〃);position二ftell(fp);return0;}intCREATE()(chartype[6][10]={〃char〃,〃int〃,〃short〃,〃float〃,〃double〃};charType1[6]={'C','N','S','F','D'};FILE*fp二NULL;Conditioncon[MAX];//约束条件结构体inti,j,num=0,error=1;//num字段数error输入错误标志chartemp[10],condition[10];//table_name表名condition约束条件memset(con,0,sizeof(con[0])*MAX);//结构体中各值初始化为空for(i=0;sql[i]=='';i++);for(j=0;sql[i]!二’’&&sql[i]!=’;’;i++,j++)temp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,"create")!=0)//判断create是否写错(error=0;printf("\n你输入的’create'有误,请重新创建!\n");}else(for(;sql[i]=='';i++);for(j=0;sql[i]!=''&&sql[i]!=';';i++,j++)temp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,"table")!=0)//判断table是否写错(error=0;printf("\n你输入的'table'有误,请重新创建!\n");}else(for(;sql[i]=='';i++);for(j=0;sql[i]!=''&&sql[i]!=';';i++,j++)//提取表名table_name[j]=tolower(sql[i]);table_name[j]='.'; //加后缀.dbftable_name[j+1]='d';table_name[j+2]='b';table_name[j+3]='f';table_name[j+4]='\0';do(intfield_lengtf=0,flag=1;//field_lengtf字段长度for(;sql[i]==',||sql[i]==,,,;i++);if(sql[i]==';')break;for(j=0;sql[i]!=,,;i++,j++)//提取列名rec.field[num].fieldName[j]=sql[i];rec.field[num].fieldName[j]=,\0,;for(;sql[i]==,,;i++);for(j=0;sql[i]!=,,&&sql[i]!二,,,;i++,j++)//提取列数据类型temp[j]=tolower(sql[i]);temp[j]=,\0,;for(j=0;j<5;j++)(if(strcmp(temp,type[j])==0)(rec.field[num].fieldType=Type1[j];break;}if(j==5)//列数据类型有误(error=0;printf("\n你输入的列数据类型有误(务必是char,int,short,float,double),请重新创建!\n〃);break;}else(/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/if(rec.field[num].fieldType=='C')(〃如果类型是char需要提取列长度,如果是int、float则固定列长度为4,double则固定列长度为8for(;sql[i]=='';i++);for(;sql[i]!='';i++)//提取长度(if(sql[i]<48||sql[i]>58)//列长度必须是数字(flag=0;break;}elsefield_lengtf二field_lengtf*10+(sql[i]-48);}if(flag==0)(error=0;printf("\n你输入的列长度有误,请重新创建!\n");break;}elserec.field[num].fieldLen=field_lengtf;}elseif(rec.field[num].fieldType=='N'||rec.field[num].fieldType=='F')rec.field[num].fieldLen=4;elseif(rec.field[num].fieldType=='D')rec.field[num].fieldLen=8;elseif(rec.field[num].fieldType=='S')rec.field[num].fieldLen=2;field_lengtf=0,flag=1;for(;sql[i]=='';i++);for(j=0;sql[i]!=''&&sql[i]!=','&&sql[i]!=';';i++,j++)//提取列完整性约束condition[j]=tolower(sql[i]);condition[j]='\0';if(condition[0]!=','&&condition[0]!='\0')(if(strcmp(condition,〃primary〃)==0)//判断是否为主键(for(;sql[i]=='';i++);for(j=0;sql[i]!二’’&&sql[i]!=',’;i++,j++)temp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,〃key〃)==0)con[num].flag=1;else(error=0;printf("\n你输入的'KEY'有误,请重新创建!\n");break;}}elseif(strcmp(condition,"unique")==0)//判断是否取唯一值con[num].flag=2;elseif(strcmp(condition,"not")==0)//判断是否非空(for(;sql[i]=='';i++);for(j=0;sql[i]!=''&&sql[i]!=',';i++,j++)condition[j]=tolower(sql[i]);condition[j]='\0';if(strcmp(condition,"null")==0)con[num].flag=3;else(error=0;printf("\n你输入的约束条件'NOTNULL'有误,请重新创建!\n〃);break;}}else//列完整性约束出错(error=0;printf("\n你输入的约束条件有误(必须PARIMARYKEY,UNIQUE,NOTNULL),请重新创建!\n〃);break;}}}rec.field[num].fieldDcis=0;rec.field[num].offset=0;rec.realCounts=num+1;num++;//下一字段}while(sql[i]!二’;’);if((fp二fopen(〃d:\\student.dat〃,〃w+b〃))==NULL)//将列完整性约束条件写入文件中(printf("打开文件失败!\n");error=0;}fwrite(&con,sizeof(Condition)*num,1,fp);fclose(fp);fp=NULL;}}if(error==0)(memset(sql,0,sizeof(char)*300);//出错时清空输入的语句return0;}else(if(f!二CreateDbf(rec))//建立.dbf文件return1;elsereturn0;}return1;}intALTER()(chartype[6][10]={〃char〃,〃int〃,〃short〃,〃float〃,〃double〃};charType1[6]={'C','N','S','F','D'};FILE*fp;inti,j,num,error=1;charT; 〃列数据类型的简写Conditioncon[MAX];//约束条件结构体chartemp[10],field_name[10],f_type[10],condition[10];//field_name列名f_type列数据类型memset(&con,0,sizeof(con));//结构体中各值初始化为空for(i=0;sql[i]=='';i++);for(j=0;sql[i]!='';i++,j++)temp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,"alter")!=0)//判断alter是否写错(error=0;printf("\n你输入的'alter'有误,请重新输入SQL语句!\n");}else(for(;sql[i]=='';i++);for(j=0;sql[i]!='';i++,j++)temp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,"table")!=0)//判断table是否写错error=0;printf("\n你输入的’table'有误,请重新输入SQL语句!\n");}else(for(;sql[i]=='';i++);for(j=0;sql[i]!='';i++,j++)//提取表名table_name[j]=tolower(sql[i]);table_name[j]='.'; //加后缀.dbftable_name[j+1]='d';table_name[j+2]='b';table_name[j+3]='f';table_name[j+4]='\0';if((f=OpenDbf())==0)〃判断该表是否存在(printf("\n你输入的表%s不存在,请重新输入SQL语句!\n”,table_name);error=0;}else(for(;sql[i]=='';i++);if(tolower(sql[i])=='a')//增加属性(for(j=0;sql[i]!='';i++,j++)//判断add是否写错temp[j]=tolower(sql[i]);if(strcmp(temp,〃add〃)==0)(intfield_lengtf=0,flag=1;//field_lengtf列长度for(;sql[i]==,,;i++);for(j=0;sql[i]!=,,;i++,j++)//提取添加的列名field_name[j]=sql[i];field_name[j]=,\0,;for(;sql[i]==,,;i++);for(j=0;sql[i]!=,,&&sql[i]!二,;,;i++,j++)//提取列数据类型f_type[j]=tolower(sql[i]);f_type[j]=,\0,;for(j=0;j<5;j++)(if(strcmp(f_type,type[j])==0)(T=Type1[j];break;}}if(j==5)//列数据类型出错(error=0;memset(sql,0,sizeof(char)*300);printf("\n你输入的列数据类型有误(必须是char,int,short,float,double),请重新输入SQL语句!\n〃);return0;}if(T=='C')(//如果类型是char需要提取列长度,如果是int、float则固定列长度为4,double则固定列长度为8for(;sql[i]=='';i++);//提取列长度for(;sql[i]!二’’;i++)(if(sql[i]<48||sql[i]>58)//列长度必须是数字(flag=0;break;}elsefield_lengtf二field_lengtf*10+(sql[i]-48);}if(flag==0)(error=0;memset(sql,0,sizeof(char)*300);printf("\n你输入的列长度有误(必须是数字),请重新输入SQL语句!\n");return0;if(!(f=OpenDbf()))(printf("打开文件失败!\n");return0;}}elseif(T=='N'||T=='F')field_lengtf=4;elseif(T=='D')field_lengtf=8;elseif(T=='S')field_lengtf=2;for(;sql[i]=='';i++);for(j=0;sql[i]!二’’&&sql[i]!=';';i++,j++)condition[j]=tolower(sql[i]);condition[j]='\0';if(condition[0]!=';'&&condition[0]!='\0')(if(strcmp(condition,"primary")==0)//判断是否为主键(for(;sql[i]=='';i++);for(j=0;sql[i]!=''&&sql[i]!=';';i++,j++)temp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,〃key〃)==0)con[0].flag=1;else(error=0;printf("\n你输入的'KEY'有误,请重新输入SQL语句!\n");}}elseif(strcmp(condition,〃unique〃)==0)//判断列是否取唯一值con[0].flag=2;elseif(strcmp(condition,"not")==0)//判断是否为空(for(;sql[i]=='';i++);for(j=0;sql[i]!=''&&sql[i]!=';';i++,j++)condition[j]=tolower(sql[i]);condition[j]='\0';if(strcmp(condition,"null")==0)con[0].flag=3;else(error=0;printf("\n你输入的约束条件'NOTNULL'有误,请重新输入SQL语句!\n");}else//约束条件错误(error=0;printf("\n你输入的约束条件有误(必须PARIMARYKEY,UNIQUE,NOTNULL),请重新输入SQL语句!\n〃);}}if(error!=0)(AddField(f,field_name,T,field_lengtf,con[0].flag);if(!(fp=fopen("d:\\student.dat","a+b")))(printf("打开约束性条件文件失败,请重新输入SQL语句!\n");return0;}fwrite(&con,sizeof(Condition),1,fp);fclose(fp);}}elseif((strcmp(temp,"alter"))==0)//修改属性(for(;sql[i]=='';i++);for(j=0;sql[i]!='';i++,j++)//提取columntemp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,〃column〃)!=0)//判断column是否写正确printf("\n你输入的’column'有误,请重新输入SQL语句!\n");else(for(;sql[i]=='';i++);for(j=0;sql[i]!='';i++,j++)//提取列名field_name[j]=tolower(sql[i]);field_name[j]='\0';if(GetFieldNum(f,field_name)==-1)(printf("你输入要修改的%,不存在,请重新输入SQL语句!\n",field_name);error=0;}else(num二GetFieldNum(f,field_name);for(;sql[i]=='';i++);for(j=0;sql[i]!=''&&sql[i]!=';';i++,j++)//提取列数据类型f_type[j]=tolower(sql[i]);f_type[j]='\0';for(j=0;j<5;j++)(if(strcmp(f_type,type[j])==0)T=Type1[j];break;}}if(j==5)//列数据类型有误(error=0;printf("\n你输入的列数据类型有误(必须是char,int,short,float,double),请重新输入SQL语句!\n〃);}else(intflag=1,field_lengtf=0;if(T=='C')(〃如果类型是char需要提取列长度,如果是int、float则固定列长度为4,double则固定列长度为8for(;sql[i]=='';i++);for(;sql[i]!='';i++)//提取列长度(if(sql[i]<48||sql[i]>58)//列长度必须是数字(flag=0;break;elsefield_lengtf二field_lengtf*10+(sql[i]-48);}if(flag==0)(error=0;printf("\n你输入的列长度有误(必须是数字),请重新输入SQL语句!\n");}else(if(!(f=OpenDbf()))(printf("打开文件失败!\n");return0;}}}elseif(T=='N'||T=='F')field_lengtf=4;elseif(T=='D')field_lengtf=8;elseif(T=='S')field_lengtf=2;AlterField(f,field_name,T,field_lengtf,0);}}}else(error=0;printf("你输入的SQL语句有错误,请重新输入!\n");}}elseif(tolower(sql[i])=='d')//删除属性(for(j=0;sql[i]!='';i++,j++)//提取droptemp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,"drop")!=0)//判断drop是否写正确(error=0;printf("\n你输入的约束条件'DROP'有误,请重新输入SQL语句!\n");}else//drop正确(for(;sql[i]=='';i++);for(j=0;sql[i]!=''&&sql[i]!=';';i++,j++)field_name[j]=tolower(sql[i]);field_name[j]='\0';if(GetFieldNum(f,field_name)==-1)//判断该列是否存在(printf("你输入要删除的%,不存在,请重新输入SQL语句!\n",field_name);error=0;}else(if((!(fp=fopen(〃d:\\student.dat〃,〃r+b〃))))(printf("打开约束性条件文件失败,请重新输入SQL语句!\n");return0;}fread(&con,sizeof(Condition)*f->rec.realCounts,1,fp);num二GetFieldNum(f,field_name);for(;num<f->rec.realCounts;num++)//将此列以后的列提前一列con[num]=con[num+1];fp二fopen(〃d:\\student.dat〃,〃w+b〃);fwrite(&con,sizeof(Condition)*f->rec.realCounts,1,fp);fclose(fp);f->rec.realCounts--;DropField(f,field_name,f->rec.realCounts);}else(error=0;printf("\n你输入的alter类型有误(add,altercolumn,drop),请重新输入、。1语句!\n〃);}}}}if(error==0)〃出错(memset(sql,0,sizeof(char)*300);return0;}return1;}intOutPut()(inti;pDbfHandf;//pDbfRec*rec;FILE*fp;Conditioncon[MAX];if(!(f=OpenDbf()))(printf("打开文件失败!\n");return0;}if(fp=fopen("d:\\student.dat","r+b"))(fread(&con,sizeof(Condition)*f->rec.realCounts,1,fp);printf(〃 +〃);for(i=0;i<f->rec.realCounts;i++)printf(〃 +");printf(〃\n〃);printf(〃属性名|〃);for(i=0;i<f->rec.realCounts;i++)(if(f->rec.field[i].fieldName!二NULL)printf(〃%-6s|〃,f->rec.field[i].fieldName);}printf(〃\n〃);printf(〃 +〃);for(i=0;i<f->rec.realCounts;i++)printf(〃 +〃);printf(〃\n〃);printf(〃完整性约束|〃);for(i=0;i<f->rec.realCounts;i++)switch(con[i].flag)(case1:printf("主键|");break;case2:printf("唯一值|");break;case3:printf("非空|");break;default:printf("|");}}printf(〃\n〃);printf(〃 +〃);for(i=0;i<f->rec.realCounts;i++)printf(〃 +");printf(〃\n〃);printf(〃TYPE|〃);for(i=0;i<f->rec.realCounts;i++)(switch(f->rec.field[i].fieldType)case'N':printf("int|");break;caseC:printf("char|");break;caseS:printf("short|");break;caseF:printf("float|");break;case'D':printf("double|");break;default:printf("|");}}printf(〃\n〃);printf(〃 +〃);for(i=0;i<f->rec.realCounts;i++)printf(〃 +");printf(〃\n〃);printf(〃LENGTH|〃);for(i=0;i<f->rec.realCounts;i++)printf("%2d|”,f->rec.field[i].fiel
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年其他计算机信息服务项目申请报告模稿
- 2025年多孔微孔陶瓷材料项目规划申请报告模板
- 2025年企业高校实习生三方协议
- 2025年人才共享协议标准化文本
- 2025年合作共管协议示范文本
- 2025年借款合同范本速览
- 2025年个人公积金贷款合同调整全览
- 2025年专利权使用和解协议指南
- 2025年养老院入住协议标准
- 2025年供电设施更新改造协议
- 关于餐饮合同范本
- 2023高考数学艺考生一轮复习讲义(学生版)
- CHT 4019-2016 城市政务电子地图技术规范(正式版)
- 广西壮族自治区南宁市2024年七年级下学期语文期末试卷附答案
- 冀教版五年级数学下册全册课件【完整版】
- 微量注射泵安全使用和维护保养
- 高二物理人教版(2019)选择性必修第一册教学设计
- 《短视频拍摄与制作》课件-2短视频前期创意
- 污水处理厂运营维护移交 投标方案(技术方案)
- 部编版历史八年级上册 第八单元 教学设计
- 高中英语元宵节猜灯谜活动英文课件
评论
0/150
提交评论