C语言对DBF数据库文件的操作
软件设计大赛c语言5试题集合
第二章基本数据类型和表达式项目实训[实训 2-1]定义有关学生个人信息的变量名,如姓名、性别、家庭地址等;[实训 2-2]定义有关科目相关信息的变量名,如英语教师、数学用书等;[实训 2-3]定义有关成绩的变量名,如英语期末成绩、高等数学最高分、班级平均分等;习题1.C语言的数据类型有四大类,分别是、、、。
2.在C语言中,程序运行期间,其值不能被改变的量叫。
3.在C语言中,常量有不同的类型,包括、、和等。
4.符号常量是指。
5.整型常量和实型常量也称为,它们有正负之分。
6.C语言在定义变量的同时说明变量的,系统在编译时就能根据变量定义及其为它分配相应数量的存储空间。
7.在C语言中,标识符只能由、和三种字符组成,且第一个字符必须或。
8.可以用来表示C的整常数的进制是、、。
9.整型变量可分为、、、四种,分别用。
10.在一个整常量后面加一个字母和,则认为是long int 型常量。
11.在C语言中,实数有两种表现形式,是和。
12.C的字符常量是用括起来的一个字符。
13.在一个变量定义语句中可以同时定义多个变量,变量之间用隔开。
14.在ASCⅡ代码表中可以看到每一个小写字母比相应的大写字母的ASCⅡ代码大。
15.在 C 语言中,系统在每一个字符串的结尾自动加一个“字符串结束标志符”即,以便系统据此数据判断字符串是否结束。
16.表达式10+'a'+1.5-0.5*'b'的结果。
17.表达式10+'a'+1.5-567.345/'b'的结果是型数据。
18.如果int i=3,则printf("%d",-i++)执行后输出是,i的结果是。
19.表达式x=(a=3,6*3)和表达式x=a=3,6*a分别是表达式和表达式,两个表达式执行完的结果是和.执行后X的值分别是, .20.在C语言中的运算符优先级最小的是运算符.21.若有声明“int a=30, b=7;”,则表达式“!a+a%b”的值是。
dbf数据表头结构
我给你列出dbf的文件格式和c语言描述,对你而言应该足够了吧:表文件由头记录及数据记录组成。
头记录定义该表的结构并包含与表相关的其他信息。
头记录由文件位置 0 开始。
数据记录1紧接在头记录之后,包含字段中实际的文本。
记录的长度等于所有字段定义的长度之和。
表文件中存储整数时低位字节在前。
1.表头记录的结构:字节偏移说明备注0 文件类型 0x02 foxbase 0x03 foxbase+/dbase iii plus,无备注 0x30 visual foxpro 0x43 dbase iv sql 表文件,无备注 0x63 dbase iv sql 系统文件,无备注 0x83 foxbase+/dbase iii plus,有备注 0x8b dbase iv 有备注 0xcb dbase iv sql 表文件,有备注 0xf5 foxpro 2.x有备注 0xfb foxbase1 - 3 最近一次更新的时间4 - 7 文件中的记录数目8 - 9 第一个数据记录的位置10 - 11 每个数据记录的长度12 - 27 保留28 表的标记 0x01 具有 .cdx 结构的文件 0x02 文件包含备注。
0x04 文件是数据库请注意,这个字节可以包含任何上面值的和。
例如,0x03 表明表具有结构化.cdx和一个备注字段。
29 代码页标记30 - 31 保留,包含 0x0032 - n 字段子记录字段的数目决定了字段子记录的数目。
表中每个字段都对应一个字段子记录。
n+1 头记录终止符n+2- n+264 此范围内的 263 个字节包含后链信息如果第一个字节为 0x00,则该文件不与数据库关联。
备注:头记录中的第 8 到第 9 个字节指示数据文件中数据的起始位置。
数据记录从删除标记字节开始。
如果此字节为 ascii 空格 (0x20),该记录没有删除标记,如果第一字节为星号 (0x2a),该记录有删除标记。
visual foxpro 格式的 dbf
visual foxpro 格式的dbfVisual FoxPro(VFP)是一种数据库管理系统,而DBF是VFP所使用的数据库文件格式。
使用VFP,用户可以创建、修改和查询DBF文件中的数据。
如果你想在VFP中打开或编辑DBF文件,你可以按照以下步骤操作:1.打开Visual FoxPro软件。
2.在菜单栏中点击“文件”选择“打开”选项。
3.在打开的窗口中,找到你的DBF文件存放位置,选择该文件,然后点击“打开”。
4.在VFP中,你可以查看、编辑和修改DBF文件中的数据。
5.当你完成对DBF文件的操作后,你可以选择“文件”菜单中的“关闭”选项来关闭文件。
另外,如果你想要在其他软件中打开DBF文件,你可能需要使用一种支持DBF格式的数据库软件或转换工具,如dBASE或DBF Viewer Plus等。
当然可以。
以下是更多关于DBF文件的操作步骤:1.打开文件:首先,你需要在Visual FoxPro中打开DBF文件。
你可以通过选择“文件”菜单,然后选择“打开”,之后在文件类型中选择“DBF Files (*.dbf)”,并找到你想要打开的DBF文件。
2.查看和编辑数据:一旦文件被打开,你就可以在VFP的表浏览器中查看数据。
你也可以使用各种工具和选项来编辑数据,如添加、删除或修改记录。
3.创建新的DBF文件:如果你想创建一个新的DBF文件,你可以选择“文件”菜单中的“新建”选项,然后选择“表”来创建一个新的DBF文件。
在创建过程中,你可以设置字段名、数据类型等属性。
4.导入和导出数据:VFP提供了强大的数据导入和导出功能。
你可以将DBF文件与其他格式的文件(如Excel、CSV等)进行转换。
5.创建查询和报告:VFP允许你创建复杂的查询来检索DBF文件中的数据,并生成报告。
6.设置索引和关系:为了提高数据检索的速度,你可以为DBF文件中的字段创建索引。
此外,VFP 还支持设置表之间的关系,以实现数据的参照完整性。
C语言直接操作FORTRAN数据文件的方法
摘要:FORTRAN数据文件的结构及用C语言直接对FORTRAN数据文件进行数据读取和处理的方法,并结合实例,给出了完成操作的C语言源程序。
关键词:C语言FORTRAN数据文件数据直接读写FORTRAN语言适用于数值计算,在科学和工程计算方面发挥了重要作用。
C语言具有很强的通用程序设计功能,而且很适于处理图形图像、系统程序方面的问题,但它的数值计算能力不如FORTRAN语言。
如果能在C语言程序中直接调用FORTRAN程序的计算结果,则可充分利用这2种语言的优势。
为此,有必要建立用C语言对FORTRAN数据文件进行直接读取和处理的方法。
1 FORTRAN数据文件的结构在C语言程序中调用FORTRAN程序的计算结果,可通过FORTRAN数据文件来实现,而要用C语言直接存取FORTRAN数据文件,必须首先清楚FORTRAN数据文件的结构。
FORTRAN数据文件按存取方式的不同可分为顺序文件和直接文件。
而不论是顺序文件还是直接文件,按数据在文件中的存放方式的不同,都有2种存放形式,一种是字符形式(即ASCII码形式),另一种是二进制代码形式。
前者称为有格式存放,后者称为无格式存放。
由于对直接文件存取的基本操作步骤与对顺序文件存取的基本操作步骤相同,二者的不同主要体现在操作时是否应顺序进行。
下面以顺序文件为例进行具体分析。
1.1 有格式文件的结构有格式文件全部由有格式的记录组成,有格式的记录是字符的序列,以ASCII码形式存放。
各记录以回车符(0DH)和换行符(0AH)作为结束标志,各记录之间无分隔符,各记录的长度(字节数)可以不等。
1.2 无格式文件的结构无格式文件全部由无格式记录组成,无格式记录是值的序列,即二进制代码序列。
这种格式的文件,其第1个字节是4BH(即十进制的75),最后1个字节为82H(即十进制的130),各无格式记录的数据信息位于这2个字节之间。
每一个无格式记录都由下面3部分组成:(1)记录的首字节,是该记录所有数据所占的字节数;(2)组成该记录的各数据内容。
DBF命令
DBF常用命令汇总1.按条件选中某个/某部分对象Brow for 某字段=”值”例子:1.brow for frdm=”148410532”挑选出法人代码为148410532的企业2.brow for a19=”3220 挑选出行业代码为3220的企业2.删除含有***的记录(1)Delete from 文件名 where 条件 like “%***%”例子:从B1011112中删除地址代码为331101000000的记录Delete from B1011112 where dzdm like “%331101000000%”注意:该条命令执行后,如果当前文件为打开,那么现实的是符合条件的记录前面方框为黑色,当时记录仍显示,如果需要显示删除后的数据库,输入pack命令。
(2)delete for 目标字段=”某值”例子:从B1011112中删除地址代码为331101000000的记录Delete for dzdm=”331101000000”两条命令的区别在于:第一条命令是在目标文件打开或关闭的情况下都可以执行,第二条命令必须在目标文件打开的情况下执行。
3.修改字段名Modi stru直接在命令栏输入该命令,回车,会出现以下窗口,便可根据自己需求对目标字段进行修改。
(或者显示—表设计器)4.用表中某一列替换另外一列或者用某固定值去替换。
例子:用331101000000代替地址代码为331128000000的字段Repl dzdm with “331101000000” for dzdm=”331128000000” all5.两库合并例子:将B101表和B201表合并Sele 1Use B1011202Sele 2Use B2011202Sele 1Join with b to 123 for a.frdm=b.frdm6.从大库中剔除某部分Sele *(固定值) from 大库文件名where frdm not in (sele frdm from 小库文件名) into dbf 自命名文件。
DBF文件格式详细说明及程序设计
DBF文件格式详细说明及程序设计三峡大学水利与环境学院肖泽云1 DBF文件格式说明DBF文件是一种以二进制进行存储的表格数据文件,其文件内部有着严格的格式要求,具体由文件头和记录项组成。
其中文件头中包括字段的相关信息。
DBF注意,在表格记录数据中每行数据具体占多长字节,这个由文件头中定义的字段数目以及字段长度来决定,如果该文件一共只有两个字段,其中第一个字段为数值,其长度为4,第二个字段为字符串,长度为50,则每一行数据占的字节长度为4+50=54,在读取数据时也是读取前4个为第一个字段对应的值,读取第5-54个为第二个字段对应的值。
另外,为便于理解表格与下面内容的关系,特说明字段即是指表格中的列,记录指表格中的行数据,DBF按行数据方式来存储,即在文件头中定义了列数、列的名称、列的数据类型、列长度等等,然后在后面的记录数据中插入每行数据。
每个字段定义格式如下表,每个字段定义都用32个字节来完成:2 DBF文件数据结构实例分析下面以一个具体实例来分析DBF数据结构:该表格数据为:列1 列21 22 43 64 85 106 127 148 169 1810 20用UltraEdit打开该dbf文件,其内容如下:现在先分解一下,找出文件头,并分析一下文件头的内容。
首先看第一个字节,值为03,这个是16进制的数据,第一个字节表示数据库类型,值03即0x03,对应FoxBASE+/Dbase III plus,。
然后看第4个字节到第7个字节,这一段表示文件中的记录条数,即表格的行数,其Byte值为0A 00 00 00,转换成Int32即为10,即表格的行数为10。
关于Byte数组转换成数值类型,其代码如下:/// <summary>/// 将字节组转换成为整型/// </summary>/// <param name="tempBytes">字节数组</param>/// <returns></returns>public static Int32 ConvertBytesToInt32(byte[] tempBytes){Int32 result = System.BitConverter.ToInt32(tempBytes, 0); return result;}接着看第8个和第9字节,其值为61 00,转换成Int16其值即为97,意思就是说文件头所占字节长度为97,所以文件头的范围就是下面红色框内:蓝色框为左边红色框对应的值,这个仅供参考。
shp系列(六)——利用C++进行Dbf文件的写(创建)
shp系列(六)——利⽤C++进⾏Dbf⽂件的写(创建)上⼀篇介绍了shp⽂件的创建,接下来介绍dbf的创建。
推荐结合读取dbf的博客⼀起看!推荐结合读取dbf的博客⼀起看!推荐结合读取dbf的博客⼀起看!1.Dbf头⽂件的创建Dbf头⽂件的结构如下:记录项数组说明:字段类型说明:关于每项的具体含义参照读取dbf⽂件的解释,这⾥重点解释⼏项:HeaderByteNum指dbf头⽂件的字节数,数值不⽤除于2,具体为:从version到Reserved2(共32) + n个字段 * 每⼀个字段长度 32 + terminator。
RecordByteNum指每条记录的字节数,数值不⽤除于2,RecordByteNum根据记录的实际长度来写,具体为:∑每个字段的字节数(字段数量根据读取打开shp的字段数决定)。
例如我的例⼦中写了⼋个字段,则⼀条记录的实际长度为:1(deleteFlag) + 10 + 32 + 16 + 10 + 10 + 8 + 19 + 19 = 1 + 124 =125。
2.Dbf记录实体的创建记录实体就是每条记录,⼀个记录有多个字段,部分字段上存储必要的信息。
由于实际上每个shp⽂件的表的字段数可能不⼀样,并且每个字段的类型不固定,需要每次判定字段类型,然后根据不同类型设置来输出信息。
但是这费时费⼒,根据实际情况,简化⼀下,读取已知字段数和字段类型的DBF的信息,或者说,根据实际需要的字段数和字段类型来输出,牺牲普遍性来获取快速结果,以后修改也不困难。
3.创建Dbf的代码void WriteDbf(CString filename){//创建与Shp⽂件同名的指针int n = filename.ReverseFind('.');filename = filename.Left(n);filename = filename + ".dbf";FILE* m_DbfFile_fp;if ((m_DbfFile_fp = fopen(filename, "wb")) == NULL)return;//****创建dbf⽂件的⽂件头int i, j;BYTE version = 4;fwrite(&version, 1, 1, m_DbfFile_fp);CTime t = CTime::GetCurrentTime();int d = t.GetDay();int y = t.GetYear() % 2000;int m = t.GetMonth();BYTE date[3];date[0] = y;date[1] = m;date[2] = d;for (i = 0; i<3; i++) //记录时间fwrite(date + i, 1, 1, m_DbfFile_fp);int RecordNum = map->layer->objects.size(); //⽂件中的记录条数fwrite(&RecordNum, sizeof(int), 1, m_DbfFile_fp);short HeaderByteNum = 0; //⽂件头中的字节数,暂时写0,后⾯要返回来修改fwrite(&HeaderByteNum, sizeof(short), 1, m_DbfFile_fp);short RecordByteNum = 0; //⼀条记录中的字节长度,暂时写0,后⾯要返回来修改fwrite(&RecordByteNum, sizeof(short), 1, m_DbfFile_fp);short Reserved1 = 0;fwrite(&Reserved1, sizeof(short), 1, m_DbfFile_fp);BYTE Flag4s = 0;fwrite(&Flag4s, sizeof(BYTE), 1, m_DbfFile_fp);BYTE EncrypteFlag = 0;fwrite(&EncrypteFlag, sizeof(BYTE), 1, m_DbfFile_fp);int Unused[3] = { 0,0,0 };for (i = 0; i<3; i++)fwrite(Unused + i, sizeof(int), 1, m_DbfFile_fp);BYTE MDXFlag = 0;fwrite(&MDXFlag, sizeof(BYTE), 1, m_DbfFile_fp);BYTE LDriID = 0;fwrite(&LDriID, sizeof(BYTE), 1, m_DbfFile_fp);short Reserved2 = 0;fwrite(&Reserved2, sizeof(short), 1, m_DbfFile_fp);//****写记录项数组int fieldscount = fieldscount_final; //字段数量可以根据读取的shp⽂件确定for (i = 0; i< fieldscount; i++){RecordItem recordItem = recordItems[i]; //recordItems是⾃⼰设置的记录项数组(字段)的数组,//根据需求设定每个记录项数组(字段)的参数,以供调⽤//****name--------11 bytesfwrite(, 11, 1, m_DbfFile_fp);//****FieldType----1 bytesfwrite(&(recordItem.fieldType), sizeof(BYTE), 1, m_DbfFile_fp);//****Reserved3----4 bytesfwrite(&(recordItem.Reserved3), sizeof(int), 1, m_DbfFile_fp);//****FieldLength--1 bytesfwrite(&(recordItem.fieldLength), sizeof(BYTE), 1, m_DbfFile_fp);//****DecimalCount-1 bytesfwrite(&(recordItem.decimalCount), sizeof(BYTE), 1, m_DbfFile_fp);//****Reserved4----2 bytesfwrite(&(recordItem.Reserved4), sizeof(short), 1, m_DbfFile_fp);//****WorkID-------1 bytesfwrite(&(recordItem.workID), sizeof(BYTE), 1, m_DbfFile_fp);//****Reserved5----10 bytesfor (j = 0; j<5; j++)fwrite(recordItem.Reserved5 + j, sizeof(short), 1, m_DbfFile_fp);//****MDXFlag1-----1 bytesfwrite(&(recordItem.mDXFlag1), sizeof(BYTE), 1, m_DbfFile_fp);}BYTE terminator = 13; //头⽂件终⽌标识符fwrite(&terminator, sizeof(BYTE), 1, m_DbfFile_fp);fseek(m_DbfFile_fp, 8, SEEK_SET); //转到头⽂件字节数RecordByteNum,开始重写HeaderByteNum = 32 + 32 * fieldscount + 1; //从version到Reserved2(共32) + n个字段 * 每⼀个字段长度 32 + terminator fwrite(&HeaderByteNum, sizeof(short), 1, m_DbfFile_fp);RecordByteNum = 1 + 124; //RecordByteNum根据记录的实际长度来写,∑每个字段的长度// 1 + 10 + 32 + 16 + 10 + 10 + 8 + 19 + 19 = 1 + 124 =125fseek(m_DbfFile_fp, 10, SEEK_SET); //转移每条记录长度RecordByteNumfwrite(&RecordByteNum, sizeof(short), 1, m_DbfFile_fp);fseek(m_DbfFile_fp, 0, SEEK_END);//****写dbf⽂件头结束//****写每条记录BYTE deleteFlag;char media[40];for (i = 1; i <= RecordNum; i++){CGeoPolygon* polygon = (CGeoPolygon*)map->layer->objects[i - 1];deleteFlag = 32; //默认写32fwrite(&deleteFlag, sizeof(BYTE), 1, m_DbfFile_fp); //读取删除标记 1字节//****写 ObjectID intstringstream ss;ss << (i - 1);string str = ss.str();int length = str.length();memset(media, '\0', 40);for (int m = 0; m < 10 - length; m++)media[m] = ' ';for (int c = 10 - length; c < 10; c++)media[c] = str[c - 10 + length];//****写Dest stringmemset(media, '\0', 40);media[0] = '/';for (int c = 1; c <32; c++)media[c] = ' ';for (j = 0; j<32; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp); //--32 //****写Ec stringfor (j = 0; j<16; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp); //--16 //****写EcRm intss << -8888;str = ss.str();length = str.length();memset(media, '\0', 40);for (int m = 0; m < 10 - length; m++)media[m] = ' ';for (int c = 10 - length; c < 10; c++)media[c] = str[c - 10 + length];for (j = 0; j<10; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp); //--10 //****写Elevt intfor (j = 0; j<10; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp); //--10 //****写Cc intstr = polygon->objectAttribute;memset(media, '\0', 40);length = str.length();for (int c = 0; c < length; c++)media[c] = str[c];for (int c = length; c < 8; c++)media[c] = ' ';for (j = 0; j<8; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp); //--8 //****写shape_length doubleCString str1;double shape_length = polygon->getAllLength();str1.Format(_T("%.11e"), shape_length);memset(media, '\0', 40);media[0] = ' ';for (int c = 1; c < 16; c++)media[c] = str1[c - 1];if (str1.GetLength() == 18)for (int c = 16; c < 19; c++)media[c] = str1[c - 1];else {media[16] = '0';media[17] = str1[15];media[18] = str1[16];}//*(media + length ) = '\0';for (j = 0; j<19; j++)fwrite(media + j, sizeof(char), 1, m_DbfFile_fp); //--19 //****写shape_Area doubledouble shape_area = polygon->shapeArea;str1.Format(_T("%.11e"), shape_area);memset(media, '\0', 40);media[0] = ' ';for (int c = 1; c < 16; c++)media[c] = str1[c - 1];if (str1.GetLength() == 18)for (int c = 16; c < 19; c++)media[c] = str1[c - 1];else {media[16] = '0';media[17] = str1[15];media[18] = str1[16];}}//****写dbf⽂件记录结束fclose(m_DbfFile_fp);}下⼀篇将介绍Shx的创建。
C#读取DBF数据
方法一:C#读DBF格式数据System.Data.Odbc.OdbcConnection conn =new System.Data.Odbc.OdbcConnection();string table = @"D:\text\REVENUE.DBF";string connStr = @"Driver={Microsoft dBASE Driver(*.dbf)};SourceType=DBF;Data Source=" + table +";Exclusive=No;NULL=NO;Collate=Machine;BACKGROUNDFETCH=NO;DELETED=NO" ;conn.ConnectionString = connStr;conn.Open();string sql = @"select * from " + table;OdbcDataAdapter da = new OdbcDataAdapter(sql, conn);DataTable dt = new DataTable();da.Fill(dt);this.TestReaddbf.DataSource = dt.DefaultView;this.TestReaddbf.DataBind();调试过程中常见问题:1.[Microsoft][ODBC dBASE Driver]外部表不是预期的格式原因是:dbf版本太低的缘故解决方法:用DBF Converter软件,将原数据根式转换成dbaseⅤⅠ格式即可2.方法二:C#读DBF格式数据链接字符串采用string connStr = @"Driver={Microsoft Visual FoxProDriver};SourceType=DBF;SourceDB=" + table +";Exclusive=No;NULL=NO;Collate=Machine;BACKGROUNDFETCH=NO;DELETED=NO" ;调试过程中常见问题:不能打开dbf文件,ERROR[IM001],ODBC驱动程序管理器不支持此功能。
C语言对DBF数据库文件的操作
//file_head.no_recs=c[0]+
c[1]+
_dos_read(fhandle, buffer, file_head.rec_len+1, &tmp); dbfseek(file_head.no_recs ); _dos_write(fhandle, &dbfitem, file_head.rec_len, &tmp); dbfseek(file_head.no_recs+1); file_head.no_recs = file_head.no_recs + 1; _dos_write(fhandle, buffer, file_head.rec_len + 1, &tmp); sprintf(c, "%-c", file_head.no_recs); lseek(fhandle, 4L,SEEK_SET); _dos_write(fhandle, c, 4, &tmp); } void dbfread(C_REC *crecord){ unsigned tmp; _dos_read(fhandle, &dbfitem, file_head.rec_len, &tmp); convDBF2C(crecord); } void dbfwrite(C_REC crecord){ unsigned tmp; convC2DBF(crecord); _dos_write(fhandle, &dbfitem, file_head.rec_len, &tmp); } int nextrecord(void) { if (currec < numofrec) { currec++; return 1; } else return 0; } void convDBF2C(C_REC *crecord){ strncpy(crecord->userid, erid, m_useridlen); crecord->userid[m_useridlen]=0; strncpy(crecord->username, ername, m_usernamelen); crecord->username[m_usernamelen]=0; strncpy(crecord->area, dbfitem.area, m_arealen); crecord->area[m_arealen]=0; } void convC2DBF(C_REC crecord){
C#中如何用流的方式读取arcgis的dbf文件
新制作了一个库存管理软件(c/s),数据库用mssql,客户端用.net开发。
用户在客户端对数据进行查看、添加、导入、编辑、删除、打印等操作。
公司原来的一些数据存储在.dbf文件中,必须在客户端对.dbf文件进行访问,以导入数据。
从网上搜集到关于.dbf文件格式的信息和一部分c语言直接访问.dbf文件的实例,写了一个c#直接访问.dbf的类,支持直接获取.dbf文件的DataSet,获取单个字段信息等。
1。
定义.dbf文件头类namespace Sunman.DBF...{using System;/**//// <summary>/// .dbf 文件的文件头信息类/// </summary>internal class DBFHeader...{public const int DBFHeaderSize = 32;/**//* 版本标志0x02 FoxBASE0x03 FoxBASE+/dBASE III PLUS,无备注0x30 Visual FoxPro0x43 dBASE IV SQL 表文件,无备注0x63 dBASE IV SQL 系统文件,无备注0x83 FoxBASE+/dBASE III PLUS,有备注0x8B dBASE IV 有备注0xCB dBASE IV SQL 表文件,有备注0xF5 FoxPro 2.x(或更早版本)有备注0xFB FoxBASE*/public sbyte Version;/**//* 最后更新年*/public byte LastModifyYear;/**//* 最后更新月*/public byte LastModifyMonth;/**//* 最后更新日*/public byte LastModifyDay;/**//* 文件包含的总记录数*/public uint RecordCount;/**//* 第一条记录的偏移值,这个值也可以表示文件头长度*/public ushort HeaderLength;/**//* 记录长度,包括删除标志*/public ushort RecordLength;/**//* 保留*/public byte[] Reserved = new byte[16];/**//* 表的标志0x01具有.cdx 结构的文件0x02文件包含备注0x04文件是数据库(.dbc)标志可OR*/public sbyte TableFlag;/**//* 代码页标志*/public sbyte CodePageFlag;/**//* 保留*/public byte[] Reserved2 = new byte[2];}}2。
dbc文件解析代码 c语言
dbc文件解析代码 c语言【最新版】目录1.介绍 dbc 文件2.解析 dbc 文件的 c 语言代码示例3.解析过程中的关键步骤4.总结正文一、介绍 dbc 文件DBC(Database Connectivity)文件是 Visual FoxPro 数据库系统的一种数据文件格式,它包含了表结构、数据和应用程序的关联信息。
DBC 文件通常用于存储和维护 Visual FoxPro 数据库应用程序的数据。
对于开发人员来说,解析 DBC 文件是理解和维护这些应用程序的关键。
二、解析 dbc 文件的 c 语言代码示例在 C 语言中,可以使用 Visual FoxPro 的 SDK(Software Development Kit)来解析 DBC 文件。
以下是一个简单的 C 语言代码示例,用于读取和解析 DBC 文件:```c#include <stdio.h>#include <stdlib.h>#include <fox.h>int main(){// 打开 DBC 文件FXFILE dbcFile;if (FXOpenFile(&dbcFile, "example.dbc", 0) == -1){printf("Error: cannot open DBC file.");return 1;}// 获取 DBC 文件中的表信息FXTABLEDESCRIPTION tableDesc;if (FXGetTableDescription(&dbcFile, &tableDesc) == -1) {printf("Error: cannot get table description.");return 1;}// 打印表名和字段信息printf("Table name: %s", tableDesc.szTableName);printf("Number of fields: %d", tableDesc.cFields);for (int i = 0; i < tableDesc.cFields; i++){printf("Field %d: %s (%s)", i + 1, tableDesc.rgFieldNames[i],tableDesc.rgFieldTypes[i]);}// 关闭 DBC 文件FXCloseFile(&dbcFile);return 0;}```三、解析过程中的关键步骤1.打开 DBC 文件:使用 FXOpenFile 函数打开 DBC 文件,并检查返回值以确认文件是否成功打开。
操作(DBF格式数据)总结
DBF数据导入、导出总结--从SQL Server查询器预览dBase 文件中数据select*from openrowset('MICROSOFT.ACE.OLEDB.12.0','dBase5.0;database=D:\dbf','select * from [1111.dbf]')--若提示:无法处理对象"select * from [1.dbf]"。
链接服务器"(null)" 的OLE DB 访问接口"MICROSOFT.ACE.OLEDB.12.0" 指示该对象没有列,或当前用户没有访问该对象的权限。
--解决:这个文件损坏了,或者是需要用户名和密码select*from openrowset('VFPOLEDB.1','D:\dbf';'admin';'','select * from [1111.dbf]')--前提是系统已经安装vfpoledb 驱动select*from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver; SourceDB=D:\dbf; SourceType=DBF','select * from [1111.dbf]')--注:odbc连接dbf表出现[Microsoft][ODBC 驱动程序管理器] 驱动程序不支持此功能”错误的解决方法为原来是操作系统升级到win2003后机器上的foxpro的odbc驱动太新了。
不支持老式的访问驱动了。
--需要从一个xp系统上复制一个dll到win2003系统中覆盖,dll的名称是vfpodbc.dll, 大小为K,版本.1.8630.1。
C#访问dbf数据库报错解决办法
用oledb读取dbf文件报错--“外部表不是预期的格式”我的代码如下string ole_connstring=String.Empty;ole_connstring = @"Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;Data Source="+FilePath;OleDbConnection ole_conn = new OleDbConnection(ole_connstring); ole_conn.Open();string insertsql="Insert into ["+tableName+"] (.......; OleDbCommand da=new OleDbCommand(insertsql,ole_conn);da.ExecuteNonQuery();DBF版本问题,用VFP9的OLEDB即可方法一:进入VFPUSE TTCOPY TO NEWTT TYPE FOX2X此方法是把表的文件版本转为新的VFP文件版本解决版本问题。
方法二:升级JET 引擎到SP8,安装MDAC 2.8,到MS的网站去找1、VFP9的驱动是最新的,各种版本的DBF均可读出;2、你的连接字串是用JET的引擎,故要升级JET及MDAC;3、所需文件在MS的网站均有下载。
方法三:安装vfpoledb.exe(VFP9的OLEDB),在项目中引用Microsoft OLE DB Provider for FoxPro 7.0 Type Library 1.0,然后使用如下代码:OleDbConnection con = newOleDbConnection("Provider=VFPOLEDB.1;Data Source=D:\\2006工程\\南京建设质量监督站\\资料;Collating Sequence=MACHINE"); con.Open();DataTable dtQY=new DataTable();OleDbDataAdapter adapt=new OleDbDataAdapter();adapt.MissingSchemaAction=MissingSchemaAction.AddWithKey; adapt.SelectCommand = new OleDbCommand("select * from 200512.DBF",con);adapt.Fill(dtQY);adapt.Dispose();DataView dvQY = dtQY.DefaultView;dtQY.Dispose();con.Close();。
C语言对DBF数据库文件的操作
C语言对DBF数据库文件的操作Xbase库是一个开源的C语言库,用于读写和处理DBF数据库文件。
它提供了一组函数,可以方便地对DBF文件进行打开、关闭、读取、写入、更新等操作。
下面是使用Xbase库进行DBF文件操作的主要步骤:1. 引入Xbase库2.打开DBF文件使用Xbase库的函数`DBF_OPEN(`可以打开一个DBF文件,并返回一个DBF文件指针。
可以通过该指针来操作DBF文件的相关属性。
3.读取DBF文件使用Xbase库的函数`DBF_GET_FIELD_COUNT(`可以获取DBF文件中字段的总数。
可以使用循环遍历的方式读取每个字段的名称、类型、长度等信息,以及每条记录中的具体数据。
4.写入DBF文件使用Xbase库的函数`DBF_APPEND_RECORD(`可以在DBF文件末尾添加一条记录。
使用函数`DBF_PUT_FIELD_DATA(`可以设置每个字段的具体值。
5.更新DBF文件使用Xbase库的函数`DBF_WRITE_CURRENT_RECORD(`可以将更新后的数据写入DBF文件。
6.关闭DBF文件使用Xbase库的函数`DBF_CLOSE(`可以关闭DBF文件,释放相关资源。
下面是一个简单的示例,演示了如何使用Xbase库进行DBF文件的读写操作:```c#include <stdio.h>#include <xbase.h>int maiDBFHandle dbf = DBF_OPEN("test.dbf", "rb+"); // 打开DBF文件int fieldCount = DBF_GET_FIELD_COUNT(dbf); // 获取字段数for (int i = 0; i < fieldCount; i++)char fieldName[12];int fieldType, fieldLen;DBF_GET_FIELD_INFO(dbf, i, fieldName, &fieldType, &fieldLen);printf("Field %d: %s, Type: %d, Length: %d\n", i, fieldName, fieldType, fieldLen);}DBF_APPEND_RECORD(dbf); // 添加记录DBF_PUT_FIELD_DATA(dbf, 0, "John"); // 设置字段值DBF_PUT_FIELD_DATA(dbf, 1, "Doe");DBF_WRITE_CURRENT_RECORD(dbf); // 写入文件DBF_CLOSE(dbf); // 关闭DBF文件return 0;```上述代码中,首先通过`DBF_OPEN(`函数打开DBF文件,然后使用`DBF_GET_FIELD_COUNT(`获取字段数,并使用循环打印出每个字段的信息。
用C#对DBF数据库的操作
⽤C#对DBF数据库的操作现在⼤部分C#连接数据库都会是sql server 。
但对⼀些旧的数据库⽂件的连接和操作就不太熟了。
今天就有这个问题,要对FOXPRO⽣成的DBF⽂件数据库进⾏操作。
我在CSDN上查了很久,⼤部分有问题都没很好地回复到这些操作上的问题。
经过我的实验,⽤ODBC来连接它就可以了。
下⾯是所⽤的代码。
都很简单,就是格式上要注意。
和⽤开的查询语句会有很⼤不同。
protected void Page_Load(object sender, EventArgs e){System.Data.Odbc.OdbcConnection conn = new System.Data.Odbc.OdbcConnection();string table = @"D:\aaa\code.dbf";string Visual FoxPro Driver};SourceType=DBF;SourceDB=" + table +";Exclusive=No;NULL=NO;Collate=Machine;BACKGROUNDFETCH=NO;DELETED=NO";conn.ConnectionString = connStr;conn.Open();OdbcCommand cmd = new OdbcCommand();cmd.Connection = conn;string sql = "update " + table + " set other='2',rate=1.014 ";mandText = sql;mandType = CommandType.Text;cmd.ExecuteNonQuery();sql = @"select * from " + table;OdbcDataAdapter da = new OdbcDataAdapter(sql,conn);DataTable dt = new DataTable();da.Fill(dt);this.GridView1.DataSource = dt.DefaultView;this.GridView1.DataBind();}注意点:1 连接串的格式。
巨经典的DBF文件C++操作程序
dbf文件C/C++的操作库程序。
求:dbf文件C/C++的操作库程序。
/************************************************************************ DBFOP for C++ V1.00 ,1995.1.10Develop by John,LiaoModified by Zhanghao. 1998.05.18This Module include the C++ headfile dbfop.hpp,and C++ resource file dbfop.cpp.This module is develop for use DBF(DBASEIII,DBASEII,MFOXBASE,FOXPRO 2.x)and IDX(MFOXBASE).but use IDX only allow read or change the field thatisn't key word.Support netware share .flielock,fileunlock,recordlock,recordunlock.*************************************************************************/ /* -----------------------------------------------------------------------The class DBF is interface to custom,all function that givencan be invoked by use the class DBF.------------------------------------------------------------------------1995.7.29 Change file option fxxx to xxx like _fsopen replace with sopen1995.7.31 Change dowith option when type='N'1995.7.31 Add option DBF::append(),DBF::clear();1998.5.18 Add Foxpro 2.x DBF process.-------------------------------------------------------------------------*/#include "stdafx.h"#ifdef DEBUG#define debugm AfxMessageBox#define new DEBUG_NEW#endifstatic INT2 ccc(CHAR *,INT2,INT2);INT2 ccc(CHAR * ptsr,INT2 len,INT2 bit){CHAR temp1[30],temp11[30],i1;CHAR temp2[30],temp22[30],i2;INT2 tempi,i;CHAR * ps,*ps1;for(ps1=ptsr;(*ps1==' ')&&(*ps1!='\x0');ps1++);ps=strchr(ps1,'.');if(ps==NULL){ // NOT HAVE '.'strcpy(temp1,ps1);temp2[0]='\x0';}else{*ps='\x0';strcpy(temp1,ps1);ps++;strcpy(temp2,ps);}i1=len-(bit?(bit+1):0);if((int)strlen(temp1)>;(int)i1){strncpy(temp11,temp1,i1);temp11[i1]='\x0';}else{tempi=i1-strlen(temp1);for(i=0;i<tempi;i++) temp11=' ';strcpy(temp11+tempi,temp1);}// ------------------------------------------if(bit>;0){if((int)strlen(temp2)>;(int)bit){strncpy(temp22,temp2,bit);temp22[bit]='\x0';}else{i2=strlen(temp2);tempi=bit-strlen(temp2);strcpy(temp22,temp2);for(i=0;i<tempi;i++) (temp22+i2)='0';temp22[bit]='\x0';}}strcpy(ptsr,temp11);if(bit!=0){strcat(ptsr,".";strcat(ptsr,temp22);}return 0;}INT2 IDX_BLOCK::skip(){if(curp>;=(INT2)items-1){return -2;}curp++; // doublereturn 0;}INT2 IDX_BLOCK::find(CHAR * key){INT2 compi=keylen;CHAR *p=buff+12;INT2 RetCode,i;if((int)strlen(key)<(int)keylen)compi=strlen(key);for(i=0,p=buff+12;i<items;i++,p+=keylen+4){RetCode=strncmp(key,p,compi);if(RetCode==0) // Founded this keyif(flag>;=2){ // .and. this is a leaf or leaf&root nodecurp=i;return 0; // Founded ,OK return to master}else{ // .and. this is a frame or root nodecurp=i;return -10; // This is a ROOT,Maybe in gaven BLOCK}if(RetCode<0){ //if the key < curent key in idx fileif(flag<2){ //and this is FRAME or ROOT nodecurp=i; //in FRAME or ROOT node key is MAXKEY in given nodereturn -10;//This is a ROOT,Maybe in gaven BLOCK}}}return -3; // Maybe in NextBlock}IDX::IDX(){Installed=0;//fp=NULL;handle=-1;rootpos=blocks=0l;key_len=0;return ;}IDX::~IDX(){if(this->;handle!=-1){close(handle);handle=-1;}}// open function open the idx fileINT2 IDX:pen(CHAR * filename){CHAR buff[30];// fp=_fsopen(filename,"rb",SH_DENYNONE);// change by liaoj int 1999.3.22handle=sopen(filename,_O_RDONLY|_O_BINARY,_SH_DENYNO,_S_IREAD);/*handle=sopen(filename,O_RDWR|O_BINARY|O_DENYNONE,SH_DENYNONE,S_IREAD|S_I_write);*/// if(fp==NULL) return -1;if(handle==-1) return -1;if(_lseek(handle,0,SEEK_SET)!=0) return -1;if(read(handle,buff,30)!=30) return -1;rootpos=*(UINT4 *)buff;blocks=*(UINT4 *)(buff+;key_len=*(INT2 *)(buff+12);block.SetKeyLen(key_len);block.ReadBlock(this->;handle,rootpos);while(block.GetFlag()<2){block.ReadBlock(this->;handle,block.GetResult());}GoHome();return 0;}INT2 IDX:rev(){UINT4 PrevBlock;if(block.Prev()!=0){PrevBlock=block.GetPrev();if(PrevBlock==0xffffffffl){return -1;}block.ReadBlock(this->;handle,(INT4)PrevBlock);block.End();}return 0;}INT2 IDX::Next(){UINT4 NextBlock;if(block.Next()!=0){ // Is already in the last node in this blockNextBlock=block.GetNext();if(NextBlock==0xffffffffl){return -2;}block.ReadBlock(this->;handle,(INT4)NextBlock);block.Home();}return 0;}INT2 IDX::Find(CHAR * key){INT2 RetCode;block.ReadBlock(this->;handle,rootpos);for(;{RetCode=block.find(key);switch(RetCode){case 0:return 0;case -1:return -1;case -2:if(block.GetPrev()==(UINT4)0xffffffffl){return -1;}else{block.ReadBlock(this->;handle,block.GetPrev());}break;case -3:if(block.GetNext()==(UINT4)0xffffffffl){return -1;}else {block.ReadBlock(this->;handle,block.GetNext());}break;case -10:block.ReadBlock(this->;handle,block.GetResult());break;default:// -------------------------------------------------// Fatal Error :: return code is not allow// in class IDX_BLOCK::find(CHAR * );// -------------------------------------------------break;}}}INT2 IDX::Skip(){return Next();}INT2 IDX::GoHome(){while(block.GetPrev()!=(UINT4)0xffffffffl){block.ReadBlock(this->;handle,block.GetPrev());};block.Home();return 0;}INT2 IDX::GoEnd(){while(block.GetNext()!=(UINT4)0xffffffffl){block.ReadBlock(this->;handle,block.GetNext());};block.End();return 0;}UINT4 IDX_BLOCK::GetResult(){CHAR tf[5];CHAR * p=buff+12+curp*(keylen+4);p+=keylen;tf[3]=p[0];tf[2]=p[1];tf[1]=p[2];tf[0]=p[3];return *(UINT4 * )tf;}//INT2 IDX_BLOCK::ReadBlock(FILE * fp,UINT4 pos)INT2 IDX_BLOCK::ReadBlock(INT2 handle,UINT4 pos){// fseek(fp,pos,SEEK_SET);_lseek(handle,pos,SEEK_SET);// fread(buff,512l,1,fp);read(handle,buff,512);flag=buff[0];count=buff[1];items=buff[2];prev=*(UINT4 *)(buff+4);next=*(UINT4 *)(buff+;curp=0;return 0;}//------------------Next is DBF ----------------------DBF:BF(){Installed=0;First=NULL;pIDX=NULL;handle=-1;buff=NULL;// ---------------------------------SwapBuffer=NULL;MaxRecNum=0;CurRecNum=0;// --------------------------------current_recno=record_no=0l;record_len=0;Name[0]='\x0';changeflag=0;dbferrno=0;fieldvalue=NULL;}DBF::~DBF(){if(First!=NULL){delete First;First=NULL;}if(SwapBuffer!=NULL) delete SwapBuffer;SwapBuffer=NULL;MaxRecNum=0;CurRecNum=0;if(pIDX!=NULL){delete First;pIDX=NULL;}if(handle!=-1){ // this::close(handle);handle=-1;}if(buff!=NULL){delete buff;buff=NULL;}if(fieldvalue!=NULL){delete fieldvalue;fieldvalue=NULL;}return;}INT2 DBF::Clear(){memset(buff,' ',record_len);return 0;}INT2 DBF::AppendBlank(){CHAR tempbuf[100];UINT4 temp_recno;INT2 i;INT4 offset;//-if(!Installed){ // Not open this filedbferrno=ClassNotInit;sprintf(this->;dbferrmsg,"ClassNotInit!";return ClassNotInit;}if(_lseek(handle,0l,SEEK_SET)!=0){dbferrno=SeekFileError;sprintf(this->;dbferrmsg,"SeekFileError!";return this->;dbferrno;}if(read(handle,tempbuf,!={this->;dbferrno=ReadFileError;sprintf(this->;dbferrmsg,"ReadFileError!";return this->;dbferrno;}temp_recno=++(*(UINT4*)(tempbuf+4));if(_lseek(handle,0l,SEEK_SET)!=0){this->;dbferrno=SeekFileError;sprintf(this->;dbferrmsg,"SeekFileError!";return dbferrno;}if(_write(handle,tempbuf,!={this->;dbferrno=WriteFileError;sprintf(this->;dbferrmsg,"WriteFileError!";return dbferrno;}offset=(INT4)head_len+(temp_recno-1l)*record_len;_lseek(handle,offset,SEEK_SET);for(i=0;i<record_len;i++) // fputc(0x20,fp); // FILL BLANK _write(handle," ",1);_write(handle,"\x1a",1);this->;ReOpen();this->;GoTo(temp_recno);return 0;}INT2 DBF::Append(){CHAR tempbuf[100];UINT4 temp_recno;INT4 offset;if(!Installed){ // Not open this filedbferrno=ClassNotInit;sprintf(this->;dbferrmsg,"ClassNotInit!";return ClassNotInit;}if(_lseek(handle,0l,SEEK_SET)!=0){dbferrno=SeekFileError;sprintf(this->;dbferrmsg,"SeekFileError!";return SeekFileError;}if(read(handle,tempbuf,!={this->;dbferrno=ReadFileError;sprintf(this->;dbferrmsg,"ReadFileError!";return dbferrno;}temp_recno=++(*(UINT4*)(tempbuf+4));// recordnum+1;if(_lseek(handle,0l,SEEK_SET)!=0){this->;dbferrno=SeekFileError;sprintf(this->;dbferrmsg,"SeekFileError!");return dbferrno;}if(_write(handle,tempbuf,!={this->;dbferrno=WriteFileError;sprintf(this->;dbferrmsg,"WriteFileError!");return dbferrno;}offset=(INT4)head_len+(temp_recno-1l)*record_len;if(_lseek(handle,offset,SEEK_SET)!=offset){this->;dbferrno=SeekFileError;sprintf(this->;dbferrmsg,"SeekFileError!");return dbferrno;}_write(handle,buff,(UINT2)record_len);_write(handle,"\x1a",1);this->;ReOpen();this->;GoTo(temp_recno);return 0;}INT2 DBF::dbf_wbuff(){//CHAR tempbuf[100];INT4 offset;offset=(INT4)head_len+(current_recno-1l)*record_len;if(current_recno<=0){dbferrno=RecordOutOfRange;sprintf(this->;dbferrmsg,"RecordOutOfRange!");return dbferrno;}if(changeflag==0){dbferrno=DBFOK;sprintf(this->;dbferrmsg,"DBFOK!");return DBFOK;}if(_lseek(handle,offset,SEEK_SET)!=offset){dbferrno=SeekFileError;sprintf(this->;dbferrmsg,"SeekFileError!");return dbferrno;}if(_write(handle,buff,(UINT2)record_len)!=(UINT2)record_len){ dbferrno=WriteFileError;sprintf(this->;dbferrmsg,"WriteFileError!");return dbferrno;}dbferrno=DBFOK;sprintf(this->;dbferrmsg,"DBFOK!");return DBFOK;}INT2 DBF::dbf_buff(){INT4 offset=(INT4)head_len+(current_recno-1l)*record_len;if(current_recno<=0){dbferrno=RecordOutOfRange;sprintf(this->;dbferrmsg,"RecordOutOfRange!");return dbferrno;}if(_lseek(handle,offset,SEEK_SET)!=offset){dbferrno=SeekFileError;sprintf(this->;dbferrmsg,"SeekFileError!");return dbferrno;}if(::eof(handle)){dbferrno=SeekFileError;sprintf(this->;dbferrmsg,"SeekFileError!");return dbferrno;}if(read(handle,buff,(UINT2)record_len)!=(UINT2)record_len){ dbferrno=ReadFileError;sprintf(this->;dbferrmsg,"ReadFileError!");return dbferrno;}changeflag=0;dbferrno=0;sprintf(this->;dbferrmsg,"DBFOK!");return 0;}INT2 DBF::Zap(){CHAR tempbuf[100];if(!Installed){ // Not open this filedbferrno=ClassNotInit;sprintf(this->;dbferrmsg,"ClassNotInit!");return dbferrno;}_lseek(handle,0l,SEEK_SET);//if(fread(tempbuf,32l,1l,fp)!=1){if(read(handle,tempbuf,32)!=32){this->;Close();dbferrno=NotDBFFile;sprintf(this->;dbferrmsg,"NotDBFFile!");return dbferrno;}*(UINT4 *)(tempbuf+4)=0l; // record_noif(chsize(handle,head_len)!=0){// ------------------------this->;dbferrno=ChsizeFileError;sprintf(this->;dbferrmsg,"ChsizeFileError!");return dbferrno;}_lseek(handle,0l,SEEK_SET);if(_write(handle,tempbuf,32)!=32){//this->;close();this->;dbferrno=WriteFileError;sprintf(this->;dbferrmsg,"WriteFileError!");return WriteFileError;}_lseek(handle,0l,SEEK_END);_write(handle,"\x1a\x0",2);MaxRecNum=0;CurRecNum=0;lock_flag=0;ReOpen();dbferrno=DBFOK;sprintf(this->;dbferrmsg,"DBFOK!");return this->;dbferrno;}INT2 DBF::Open(CHAR * filename,INT2 OpenMode_Par,INT2 DBFType_Par){CHAR tempbuf[100];INT2 i,j,FieldOffset;struct FIELD * tpf;if(Installed){this->;Close();}strcpy(Name,filename);OpenMode=OpenMode_Par;DBFType=DBFType_Par;if(OpenMode==ReadWrite){handle=_sopen(Name,_O_RDWR|_O_BINARY,_SH_DENYNO,_S_IREAD|_S_IWRITE);}else{handle=_sopen(Name,_O_RDONLY|_O_BINARY,_SH_DENYNO,_S_IREAD);}if(handle==-1){dbferrno=FileOpenFailure;sprintf(this->;dbferrmsg,"FileOpenFailure!");return dbferrno;}_lseek(handle,0l,SEEK_SET);if(read(handle,tempbuf,32)!=32){this->;Close();dbferrno=ReadFileError;sprintf(this->;dbferrmsg,"ReadFileError!");return dbferrno;}record_no=*(UINT4 *)(tempbuf+4);head_len=*(UINT2 *)(tempbuf+8);record_len=*(UINT2*)(tempbuf+10);fieldnum=(head_len)/32-1;// need automatic detect the dbf file type is foxbase or clipper if(DBFType==AutoDetect){if((head_len-1)%32==0)DBFType=Foxbase;elseDBFType=Clipper;}if(buff!=NULL){delete buff;buff=NULL;}buff=(CHAR *) new CHAR[record_len+20];if(buff==NULL){#ifdef DEBUGdebugm("DBF::Open alloc failure!");#endifthis->;Close();dbferrno=NotEnoughMemory;sprintf(this->;dbferrmsg,"NotEnoughMemory!");return dbferrno;} // memset strsetClear(); // add by liaoj 1996.12.24if(record_no==0l){current_recno=Empty;}else {current_recno=1;dbf_buff();}pFIELD=new FIELD[fieldnum];if(pFIELD==NULL){#ifdef DEBUGdebugm("DBF:pen alloc failure!");#endifthis->;Close();dbferrno=NotEnoughMemory;sprintf(this->;dbferrmsg,"NotEnoughMemory!");return dbferrno;}_lseek(handle,32l,SEEK_SET);tpf=&(pFIELD[0]);FieldOffset=1;for(i=0;i<fieldnum;i++,tpf++){// fread(tempbuf,32l,1l,fp); // memsetread(handle,tempbuf,32);memcpy(tpf,tempbuf,18);j=strlen(tpf->;name);// ----------- Cliepper or Foxbase -----if(DBFType==Foxbase)j=j>;11?11:j;elsej=7?7:j;tpf->;name[j]=0;for(j--;j>;=0;j--){if(tpf->;name[j]==' ')tpf->;name[j]=0;elsebreak;}if(DBFType==Clipper){tpf->;address=FieldOffset;FieldOffset+=tpf->;len;}else{tpf->;address=FieldOffset;FieldOffset+=tpf->;len;}}Installed=1;changeflag=0;dbferrno=DBFOK;sprintf(this->;dbferrmsg,"DBFOK!");return 0;}INT2 DBF::SetSwp(INT2 buffer_number){if (SwapBuffer!=NULL) delete SwapBuffer;CurRecNum=0;MaxRecNum=0;SwapBuffer=(CHAR *) new CHAR[(record_len+1)*buffer_number];if (SwapBuffer==NULL){#ifdef DEBUGdebugm("GGROUP::SetSwp alloc failure!");#endifdbferrno=NotEnoughMemory;sprintf(this->;dbferrmsg,"NotEnoughMemory!");return dbferrno;}CurRecNum=0;MaxRecNum=buffer_number;return DBFOK;}INT2 DBF::AppendToSwp(){if (MaxRecNum==0) return this->;Append();if (CurRecNum>;=MaxRecNum) FlushSwp();if (CurRecNum>;=MaxRecNum) {dbferrno=OtherError;sprintf(this->;dbferrmsg,"OtherError!");return OtherError;}memcpy(SwapBuffer+CurRecNum*record_len,buff,(size_t)record_len);CurRecNum++;return 0;}INT2 DBF::FlushSwp(){CHAR tempbuf[100];UINT4 temp_recno;// INT2 i;INT4 offset;if(CurRecNum==0) return 0;if(!Installed){ // Not open this filedbferrno=ClassNotInit;sprintf(this->;dbferrmsg,"ClassNotInit!");return dbferrno;}if(_lseek(handle,0l,SEEK_SET)!=0){dbferrno=SeekFileError;sprintf(this->;dbferrmsg,"SeekFileError!");return dbferrno;}if(read(handle,tempbuf,8)!=8){// this->;close();dbferrno=ReadFileError;sprintf(this->;dbferrmsg,"ReadFileError!");return dbferrno;}(*(UINT4*)(tempbuf+4))+=(UINT4)CurRecNum;//recordnum+1;temp_recno=(*(UINT4*)(tempbuf+4));if(_lseek(handle,0l,SEEK_SET)!=0){this->;dbferrno=SeekFileError;sprintf(this->;dbferrmsg,"SeekFileError!");return dbferrno;}if(_write(handle,tempbuf,8)!=8){this->;dbferrno=SeekFileError;sprintf(this->;dbferrmsg,"SeekFileError!");return dbferrno;}offset=(INT4)head_len+(temp_recno-(UINT4)CurRecNum)*record_len;if(_lseek(handle,offset,SEEK_SET)!=offset){this->;dbferrno=SeekFileError;sprintf(this->;dbferrmsg,"SeekFileError!");return dbferrno;}_write(handle,SwapBuffer,(UINT2)(record_len*CurRecNum));_write(handle,"\x1a",1);this->;ReOpen();this->;GoTo(temp_recno);CurRecNum=0;sprintf(this->;dbferrmsg,"DBFOK!");return DBFOK;}// add support delete function in this modul// addby liaoj 19990426INT2 DBF::Close(int Delete){if(handle!=-1){::close(handle); // unlinkif(Delete){ // with delete::unlink(Name);}handle=-1;}if(pIDX!=NULL){delete pIDX;pIDX = NULL;}if(buff!=NULL){delete buff;buff=NULL;}if(SwapBuffer!=NULL) delete SwapBuffer;SwapBuffer=NULL;MaxRecNum=0;CurRecNum=0;if(pFIELD!=NULL){delete pFIELD;pFIELD=NULL;}if(fieldvalue!=NULL){delete fieldvalue;fieldvalue=NULL;}lock_flag=0;Installed=0;dbferrno=DBFOK;sprintf(this->;dbferrmsg,"DBFOK!");return DBFOK;}INT2 DBF:rev(){INT2 RetCode;if(pIDX==NULL){// skip Not use IDXif(current_recno==-2){ // in the DBFEOFcurrent_recno=record_no;dbferrno=dbf_buff();return dbferrno;}if(current_recno>;1){ // in the MIDDLEcurrent_recno--;dbferrno=dbf_buff();return dbferrno;}if(current_recno==1){ // in the FirstRecordcurrent_recno=DBFBOF;dbferrno=DBFOK;return dbferrno;}if((current_recno==DBFEOF)||(current_recno==Empty)){ // in the DBFEOF;dbferrno=RecordOutOfRange;return dbferrno;}dbferrno=OtherError;return dbferrno;}if(current_recno==-2){ // in the DBFBOFpIDX->;GoEnd();current_recno=pIDX->;GetRecordNo();if(current_recno>;record_no||current_recno<1){// Fatal Error :: the IDX file is olddbferrno=IndexIsOutOfDate;sprintf(this->;dbferrmsg,"IndexIsOutOfDate!");return dbferrno;}if(current_recno==0){current_recno=Empty;dbferrno=RecordNotFound;sprintf(this->;dbferrmsg,"RecordNotFound!");return dbferrno;}else{dbf_buff();}dbferrno=DBFOK;sprintf(this->;dbferrmsg,"DBFOK!");return dbferrno;}if((current_recno==DBFBOF)||(current_recno==Empty)){ // in the DBFEOF;dbferrno=RecordNotFound;sprintf(this->;dbferrmsg,"RecordNotFound!");return dbferrno;}RetCode=pIDX->rev();if(RetCode<0){current_recno=-1;dbferrno=RecordNotFound;sprintf(this->;dbferrmsg,"RecordNotFound!");return RecordNotFound;}current_recno=pIDX->;GetRecordNo();if(current_recno>;record_no||current_recno<1){// Fatal Error :: the IDX file is old +++++++++++++++++ dbferrno=IndexIsOutOfDate;sprintf(this->;dbferrmsg,"INdexIsOutOfDate!");return dbferrno;}if(current_recno==0){current_recno=-3;}else{dbf_buff();}dbferrno=0;sprintf(this->;dbferrmsg,"DBFOK!");return 0;}INT2 DBF::Next(){return Skip();}INT2 DBF::Skip(){INT2 RetCode;if(pIDX==NULL){// skip Not use IDXif(current_recno==DBFBOF){ // in the BOFcurrent_recno=1;dbferrno=dbf_buff();return dbferrno;}if(current_recno<record_no){ // in the MIDDLEcurrent_recno++;dbferrno=dbf_buff();return dbferrno;}if(current_recno==record_no){ // in the LastRecordcurrent_recno=DBFEOF;dbferrno=DBFOK;sprintf(this->;dbferrmsg,"DBFOK!");return dbferrno;}if((current_recno==DBFEOF)||(current_recno==Empty)){ // in the DBFEOF;dbferrno=RecordOutOfRange;sprintf(this->;dbferrmsg,"RecordOutOfRange!");return dbferrno;}dbferrno=OtherError;sprintf(this->;dbferrmsg,"OtherError!");return dbferrno;}else {if(current_recno==DBFBOF){ // in the BOFpIDX->;GoHome();current_recno=pIDX->;GetRecordNo();if(current_recno>;record_no||current_recno<1){// Fatal Error :: the IDX file is old}dbferrno=dbf_buff();return dbferrno;}if((current_recno==DBFEOF)||(current_recno==Empty)){ // in the DBFEOF;dbferrno=RecordOutOfRange;sprintf(this->;dbferrmsg,"RecordOutOfRange!");return RecordOutOfRange;}RetCode=pIDX->;Next();if(RetCode<0){current_recno=DBFEOF;dbferrno=RecordOutOfRange;sprintf(this->;dbferrmsg,"RecordOutOfRange!");return RecordOutOfRange;}current_recno=pIDX->;GetRecordNo();if(current_recno==0L){current_recno=DBFEOF; // set bof()}if(current_recno>;record_no||current_recno<1){// Fatal Error :: the IDX file is old}if(current_recno==0L){current_recno=DBFEOF; // set EOF()dbferrno=DBFEOF;}else {dbferrno=dbf_buff();}return dbferrno;}}INT2 DBF::GoTo(INT4 recordno){if((recordno<=record_no)&&(recordno>;0)){current_recno=(UINT4)recordno;dbf_buff();dbferrno=DBFOK;sprintf(this->;dbferrmsg,"DBFOK!");}else {dbferrno=RecordOutOfRange;if(recordno<=0){current_recno=DBFBOF;}else if(recordno>;record_no){current_recno=DBFEOF;}sprintf(this->;dbferrmsg,"RecordOutOfRange!");}return dbferrno;}INT2 DBF::IsBOF(){if(current_recno==Empty||current_recno==DBFBOF) return 1;else return 0;}INT2 DBF::IsEOF(){if(current_recno==Empty||current_recno==DBFEOF) return 1;else return 0;}INT2 DBF::GoTop(){if(pIDX==NULL){if(record_no!=0){current_recno=1;dbferrno=dbf_buff();return dbferrno;}else{dbferrno=DBFOK;return dbferrno;}}pIDX->;GoHome();current_recno=pIDX->;GetRecordNo();if(current_recno>;0){dbferrno=dbf_buff();}else{current_recno=Empty; // bof() .and. eof()dbferrno=DBFOK;}return dbferrno;}INT2 DBF::GoBottom(){return 0;}// 0 : ok// -1: not found()INT2 DBF::Seek(CHAR * keyword){INT2 RetCode;if(pIDX==NULL){dbferrno=IndexNotInit;sprintf(this->;dbferrmsg,"IndexNotInit!");return dbferrno;}RetCode=pIDX->;Find(keyword);if(RetCode!=0){current_recno=DBFEOF; // set to eofdbferrno=RecordOutOfRange;sprintf(this->;dbferrmsg,"RecordOutOfRange!");return dbferrno;}current_recno=pIDX->;GetRecordNo();if(current_recno>;record_no||current_recno<1){// Fatal Error IDX is not match to DBF file}dbferrno=dbf_buff();return dbferrno;}INT2 DBF::fv(CHAR * fieldname_par,CHAR * fieldvalue_par,INT2 BufferLen) {INT2 RetCode;if((RetCode=FindField(fieldname_par))<0){fieldvalue_par[0]='\x0';dbferrno=FieldNotFound;sprintf(this->;dbferrmsg,"FieldNotFound!");return dbferrno;}if(RetCode>;=fieldnum){fieldvalue_par[0]='\x0';dbferrno=FieldNotFound;sprintf(this->;dbferrmsg,"FileNotFound!");return dbferrno;}return fv(RetCode,fieldvalue_par,BufferLen);}// -1: is eof() bof() in dbase.INT2 DBF::fv(INT2 fieldno_par,CHAR * fieldvalue_par,INT2 BufferLen) {struct FIELD * tpf;if(handle==-1||Installed!=1){fieldvalue_par[0]='\x0';dbferrno=FieldNotFound;sprintf(this->;dbferrmsg,"FileNotFound!");return FieldNotFound;}tpf=&(pFIELD[fieldno_par]);if(fieldno_par>;=fieldnum){fieldvalue_par[0]='\x0';dbferrno=FieldNotFound;sprintf(this->;dbferrmsg,"FileNotFound!");return FieldNotFound;}if((current_recno>;record_no)||(current_recno<0)){fieldvalue_par[0]='\x0';dbferrno=RecordOutOfRange;sprintf(this->;dbferrmsg,"RecordOutOfRange!");return dbferrno;}if(tpf->;len<BufferLen||BufferLen==0){strncpy(fieldvalue_par,(CHAR *)(buff+tpf->;address),tpf->;len);fieldvalue_par[tpf->;len]='\x0';}else{strncpy(fieldvalue_par,(CHAR *)(buff+tpf->;address),BufferLen-1);fieldvalue_par[BufferLen-1]='\x0';}/*switch(tpf->;f_type){case 'C': dbferrno=1; return 1;case 'N': dbferrno=2; return 2;case 'L': dbferrno=3; return 3;case 'M': dbferrno=4; return 4;case 'D': dbferrno=5; return 5;}*/dbferrno=DBFOK;sprintf(this->;dbferrmsg,"DBFOK!");return DBFOK;}INT2 DBF::dowith(INT2 fn,CHAR * tempb){CHAR buffer[80];struct FIELD * tpf;tpf=&(pFIELD[fn]);INT2 i;i=strlen(tempb);//switch(pFIELD[fn].f_type){switch(tpf->;f_type){case 'M':case 'C':case 'D':// for(;i<pFIELD[fn].len;i++)for(;i<tpf->;len;i++)tempb=' ';//tempb[pFIELD[fn].len]='\x0';tempb[tpf->;len]='\x0';break;case 'N':::ccc(tempb,(INT2)tpf->;len,(INT2)tpf->;bits);break;case 'L':if(tempb[0]=='1'||tempb[0]=='t'||fieldvalue[0]=='T')buffer[0]='T';else if(tempb[0]=='0'||tempb[0]=='f'||tempb[0]=='F')buffer[0]='F';elsebuffer[0]=tempb[0];tempb[0]=buffer[0];tempb[1]='\x0';break;default:dbferrno=FieldTypeError;sprintf(this->;dbferrmsg,"FieldTypeError!");return FieldTypeError;}dbferrno=DBFOK;sprintf(this->;dbferrmsg,"DBFOK!");return DBFOK;}INT2 DBF::Loca(CHAR * fieldname,CHAR * fieldvalue_par){CHAR tempbuff[100];loca_flag=0;if(fieldvalue!=NULL)delete fieldvalue;fieldvalue=new CHAR[strlen(fieldvalue_par)+10];if(fieldvalue==NULL) {#ifdef DEBUGdebugm("GGROUP::Loca alloc failure!");#endif// printf("Not enough memory!");dbferrno=NotEnoughMemory;sprintf(this->;dbferrmsg,"NotEnoughMemory!");return dbferrno;}strcpy(fieldvalue,fieldvalue_par);if((fieldno=FindField(fieldname))<0){dbferrno=FieldNotFound;sprintf(this->;dbferrmsg,"FileNotFound!");return dbferrno;}loca_flag=1;if(pIDX==NULL){current_recno=1;dbferrno=dbf_buff();}else{pIDX->;GoHome();current_recno=pIDX->;GetRecordNo();dbferrno=dbf_buff();}if(dbferrno!=DBFOK) return dbferrno;do {// check current record weather need.fv(fieldno,tempbuff);dowith(fieldno,tempbuff);if(strcmp(tempbuff,fieldvalue)==0){dbferrno=DBFOK;。
【WinForm】杂记(1):C#通过SQLite读取DB(.db)文件
【WinForm】杂记(1):C#通过SQLite读取DB(.db)⽂件第⼀步下载DLL⽂件并安装DLL下载地址选⽤版本,适⽤框架.NET Framework 4.6(可以根据⾃⼰的需要选⽤)。
下载后,系统默认安装在C:\Program Files\System.Data.SQLite路径下,拷贝System.Data.SQLite.dll⽂件到⼯程⽂件⽬录下X:/Project/bin/debug。
在解决⽅案资源管理器中,选择“引⽤”,右键后选择“添加引⽤”。
如图1,在引⽤管理器侧边栏选择“浏览”后,再点击“浏览”按钮,安装之前保存在⼯程⽂件⽬录下的System.Data.SQLite.dll,点击“确定”后完成。
在程序中添加引⽤后,在程序中添加命名空间,完成第⼀步using System.Data.SQLite; 第⼆步获取数据1public DataTable GetDataTable(string strSQL, string path){2 DataTable dt = null;3try {4 SQLiteConnection conn = new SQLiteConnection(path);5 SQLiteCommand cmd = new SQLiteCommand(strSQL,conn);6 SQLiteDataAdapter reciever = new SQLiteDataAdapter(cmd);7 dt = new DataTable();8 reciever.Fill(dt);9return dt;10 } catch{11 MessageBox.Show("There is no such a datatable");12 }13return dt;14 }其中strSQL是获取db⽂件中数据表的指令string sSQL = "SELECT * FROM item_compound;";这⾥的数据表名为"item_compound"。
实例,C#导出.dbf格式文件
实例,C#导出.dbf格式⽂件using System;using System.Collectionsusing System.Configuration;using System.Data;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.IO;using System.Text;using System.Data.Odbc;using EC;public partial class admin_aspx_default_bm_out_dbf : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){#region 创建dbf副本string _f = "stu_info";string tbl = Server.MapPath("/" + _f + ".dbf");string fileTemName = _f + "_" + DateTime.Now.ToShortDateString();string filetemPath = Server.MapPath("/dbf/" + fileTemName + ".dbf");File.Copy(tbl, filetemPath, true);#endregion#region 创建连接System.Data.Odbc.OdbcConnection conn = new System.Data.Odbc.OdbcConnection();string table = filetemPath;string connStr = @"Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + table +";Exclusive=No;NULL=NO;Collate=Machine;BACKGROUNDFETCH=NO;DELETED=NO";conn.ConnectionString = connStr;conn.Open();#endregion#region 写⼊DbObject db = new DbObject();DataSet ds = db.GetDataSet("select * from bm_zhanghao where IsStuInfo=0 and flg=恭喜您,报名成功");for (int i = 0; i < ds.Tables[0].Rows.Count; i++){OdbcCommand cmd = new OdbcCommand();cmd.Connection = conn;string sql = "insert into " + table + "([学号],[学⽣姓名],[性别名称],[证件号码],[年级],[班级名称],[专业名称],[学院名称],[层次名称],[形式名称],[学⽣类别名],[校区名称],[港澳侨台],[教⼯⼦⼥],[学制],[⼿机],[省份名称],[民族名称],[⼊学标志],[处理结果],[银⾏帐号],[准考证号]) values(" + ds.Tables[0].Rows[i]["jfh"].ToString() + "," + ds.Tables[0].Rows[i]["name"].ToString() + "," + GuanLian1(ds.Tables[0].Rows[i]["id"].ToString(), "bm_info", "xingbie") + "," + ds.Tables[0].Rows[i]["code"].ToString() + "," + System.DateTime.Now.Year.ToString() + ",⾃主招⽣班,⾃主招⽣,⾃主招⽣,报名费,⼀次性,,,,,,,,,,,," + ds.Tables[0].Rows[i]["kaohao"].ToString() + ");";mandText = sql;mandType = CommandType.Text;cmd.ExecuteNonQuery();//更新IsStuInfo=1// db.ExecuteSql("update bm_zhanghao set IsStuInfo=1 where id=" + ds.Tables[0].Rows[i]["id"].ToString());}ds.Clear();ds.Dispose();db.Dispose();conn.Close();conn.Dispose();#endregion#region 弹出导出对话框Response.ContentType = "application/x-zip-compressed";Response.AddHeader("Content-Disposition", "attachment;filename=学⽣信息导⼊_" + DateTime.Now.ToLongDateString() + ".dbf"); string filename = filetemPath;Response.TransmitFile(filename);#endregion}#region 整形绑定关联值/// <summary>/// 整形绑定关联值/// </summary>/// <param name="id">条件参数</param>/// <returns></returns>public string GuanLian(string id, string tbl, string fld){string Rn = id;if (!string.IsNullOrEmpty(id)){if (Fun.IsNumber(id)){DbObject db = new DbObject();string sql = "select " + fld + " from " + tbl + " where id=" + id;DataSet ds = db.GetDataSet(sql);if (ds.Tables[0].Rows.Count > 0){Rn = ds.Tables[0].Rows[0][0].ToString();}ds.Clear();ds.Dispose();db.Dispose();}}return Rn;}private string GuanLian1(string id, string tbl, string fld){string Rn = id;if (!string.IsNullOrEmpty(id)){if (Fun.IsNumber(id)){DbObject db = new DbObject();string sql = "select " + fld + " from " + tbl + " where uid=" + id;DataSet ds = db.GetDataSet(sql);if (ds.Tables[0].Rows.Count > 0){Rn = ds.Tables[0].Rows[0][0].ToString();}ds.Clear();ds.Dispose();db.Dispose();}}return Rn;}#endregion}。
DBF与ACCESS的导入、导出
----------DBF 导入 ACCESS----------delphi_media方法一:用ACCESS中“文件”->“获取外部数据”->“导入”方法二:用ACCESS中“文件”->“获取外部数据”->“导入”,然后文件类型选择ODBC Database(),即用数据源方式导入*****注:以上两种方法不是完全凑效,有时提示“外部表不是预期的格式”。
方法三:用VFP连接ACCESS,然后用代码把DBF数据一条一条写入ACCESS。
就像写入SQL一样方法四:先把DBF转成Excel或TXT,然再用方法一进行导入。
注:DBF表如果不含用备注字段,直接用COPY TO 表名.XLS type xl5 转成Excel,如果含用备注型字段,必须用下面方法转成EXCEL:****DbfToExcel.PRG****CLOSE DATABASES ALLSET DATE YMDSET CENTURY ONcDbfFile = GETFile("dbf")IF EMPTY(cDbfFile)RETURNENDIFUSE (cDbfFile) ALIAS FoxTable IN 0IF NOT USED("FoxTable")=MESSAGEBOX("打开表失败,程序将中止!", 16, "Error")RETURNENDIFcExcelFile = PUTFILE("保存为(&N):",JUSTSTEM(cDbfFile)+".xls","xls") IF EMPTY(cExcelFile)CLOSE DA TABASES ALLRETURNENDIFSELECT FoxTableoExcelSheet = GETOBJECT("","Excel.Sheet") && 产生Excel对象IF NOT type("oExcelSheet") = "O"=MESSAGEBOX("Excel对象创建失败,程序将中止!", 16, "Error")RETURNENDIFoExcelApp = oExcelSheet.APPLICATIONoExcelApp.Workbooks.ADD()oExcelApp.ActiveWindow.WINDOWSTA TE=2oSheet = oExcelApp.ActiveSheetnFldCount = AFIELDS(aFldList, "FoxTable")FOR i = 1 TO nFldCountoSheet.Cells(1,i).V ALUE = aFldList[i, 1]ENDFORcRecc = STR(RECCOUNT("FoxTable"))SCANWAIT WINDOW ALLTRIM(STR(RECNO())) + "/" + cRecc NOWAIT FOR i = 1 TO nFldCountvValue = .NULL.IF AT(aFldList[i, 2], "CDLMNFIBYT") = 0LOOPENDIFcFldName = aFldList[i, 1]vValue = EV ALUATE(cFldName)DO CASECASE aFldList[i, 2] = "C" && 字符/字符串vValue = TRIM(vValue)CASE aFldList[i, 2] = "D" && 日期vValue = DTOC(vValue)CASE aFldList[i, 2] = "T" && 日期时间vValue = TTOC(vValue)CASE INLIST(aFldList[i, 2], "N", "F", "I", "B", "Y") && 数值CASE aFldList[i, 2] = "L" && 逻辑CASE aFldList[i, 2] = "M" && 备注型OTHERWISEvValue = .NULL.ENDCASEIF VARtype(vValue) = "C" AND EMPTY(vValue)LOOPENDIFIF NOT ISNULL(vValue)oSheet.Cells(RECNO("FoxTable")+1, i).VALUE = vValue ENDIFENDFORENDSCANcChrStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"FOR i = 1 TO nFldCountcColumn = SUBSTR(cChrStr, INT((i-1)/26), 1) + SUBSTR(cChrStr, IIF(MOD(i, 26)= 0, 26, MOD(i, 26)) , 1)oSheet.COLUMNS(cColumn + ":" + cColumn).COLUMNWIDTH = 12 IF aFldList[i, 2] = "M"oSheet.COLUMNS(cColumn + ":" + cColumn).WrapText = .F.ENDIFENDFORoExcelApp.ActiveWorkbook.SA VEAS(cExcelFile)oExcelApp.ActiveWorkbook.CLOSE(.F.)oExcelApp.ActiveWorkbook.CLOSE(.F.)oExcelApp.QUIToExcelSheet = .NULL.oExcelApp = .NULL.WAIT CLEAR=MESSAGEBOX("转换完毕!", 64, "OK")CLOSE DATABASES ALL----------ACCESS 导出 DBF----------打开ACCESS库后,右单击要导出的表,选择“导出”,出现对话诓后,把“保存类型”选为“*.dbf”,(注意“文件名”不要超过8位,超过8位后系统会自动截取前8位) 然后点击“保存即可”。
C语言与dBASEⅢ和DBF和DBT文件的共享
C语言与dBASEⅢ和DBF和DBT文件的共享
程跃斌
【期刊名称】《微型机与应用》
【年(卷),期】1994(000)002
【摘要】用C语言读取dBASEⅢ的记录,包括数据库DBF和备注DBT文件。
【总页数】2页(P41-42)
【作者】程跃斌
【作者单位】无
【正文语种】中文
【中图分类】TP312
【相关文献】
1.基于DBaseIII文件结构的DBF控件的实现 [J], 杨旭东
2.小型机VAX/DBASE和微机dBASEⅢ的DBF文件的相互转换 [J], 刘嘉敏;沈虹
3.用高级语言处理dBASEⅢ的DBF文件 [J], 郑文荣
4.Foxbase.DBF文件转换为C语言文件的实现方法 [J], 李继华
5.关于dBASE的DBF文件向Oracle基表的通用型转换方法探讨 [J], 姚顺彬;邓玉英
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
typedef struct{ /* dbf 文件头结构 */ char vers; /* 版本标志*/ unsigned char yy,mm,dd; /* 最后更新年、月、日 */ unsigned long no_recs; /* 文件包含的总记录数 */ unsigned short head_len,rec_len; /* 文件头长度,记录长度 char reserved[20]; /* 保留 */ } dbf_head; typedef struct{ /* 字段描述结构 */ char field_name[11]; /* 字段名称 */ char field_type; /* 字段类型 */ unsigned long offset; /* 偏移量 */ unsigned char field_length; /* 字段长度 */ unsigned char field_decimal; /* 浮点数整数部分长度 */ char reserved1[2]; /* 保留 */ char dbaseiv_id; /* dbase iv work area id */ char reserved2[10];
//file_head.no_recs=c[0]+
c[1]*0x100+
c[2]*0x10000+
_dos_read(fhandle, buffer, file_head.rec_len+1, &tmp); dbfseek(file_head.no_recs ); _dos_write(fhandle, &dbfitem, file_head.rec_len, &tmp); dbfseek(file_head.no_recs+1); file_head.no_recs = file_head.no_recs + 1; _dos_write(fhandle, buffer, file_head.rec_len + 1, &tmp); sprintf(c, "%-c", file_head.no_recs); lseek(fhandle, 4L,SEEK_SET); _dos_write(fhandle, c, 4, &tmp); } void dbfread(C_REC *crecord){ unsigned tmp; _dos_read(fhandle, &dbfitem, file_head.rec_len, &tmp); convDBF2C(crecord); } void dbfwrite(C_REC crecord){ unsigned tmp; convC2DBF(crecord); _dos_write(fhandle, &dbfitem, file_head.rec_len, &tmp); } int nextrecord(void) { if (currec < numofrec) { currec++; return 1; } else return 0; } void convDBF2C(C_REC *crecord){ rid, erid, m_useridlen); crecord->userid[m_useridlen]=0; strncpy(crecord->username, ername, m_usernamelen); crecord->username[m_usernamelen]=0; strncpy(crecord->area, dbfitem.area, m_arealen); crecord->area[m_arealen]=0; } void convC2DBF(C_REC crecord){
C 语言对 DBF 数据库文件的操作
1.DBF 数据库文件的结构
要能够用 C 语言直接存取数据库文件,首先必须搞清楚数据库文件的结构。 DBF 文件由两部分组成,第一部分是文件头,其前 32 个字节是文件的整体描述,接着 每 32 个字节定义一个字段,直到碰到一个 0DH (字段描述结束符或称为文件头结束标志)为 止;第二部分是实际存放每一个记录的数据部分。文件头部分的前 32 个字节说明如表 1。 表1 库文件的整体描述 长 度 1 个字节 3 个字节 4 个字节 2 个字节 2 个字节 20 个字节 含 义 03H 表示无备注型字段,83H 表示有 最后一次修改日期(yy/mm/dd) DBF 文件的记录数,低字节在前 文件头的长度,低字节在前 记录长度,低字节在前 保留字节
strstore(erid, erid, m_useridlen); strstore(ername, ername, m_usernamelen); strstore(crecord.area, dbfitem.area, m_arealen); } void strstore(char *src, char *dest, int len){// dest 里的值存到 src int i, j; i=strlen(src); if (i>len) i=len; for (j=0; j<i; j++) *dest++=*src++; while (j<len) { *dest++=' '; j++; } }
fseek 函数将文件指针定位于需修改处,然后用 fwrite 函数写上新的内容。这里应注意的是, 由于 DBF 数据库中的各记录等长,因而当要写上的新内容不足记录所规定的字节数时,须 加空格填满。另外,在对同一数据库进行既读又写的操作时,应以读写二进制方式“rb+” 打开该数据库文件。 2.3 对 DBF 数据库的插入删除操作 1.如果要删除 DBF 数据库中的某记录,可先将要删除记录后面的全部记录读入内存, 再将文件指针定位于要删除记录的开始处, 之后将读入内存的那些记录重新写回文件中, 并 将库文件的记录数减 1。 2.如果要在 DBF 数据库中插入一条记录,可先将文件指针定位于要插入的位置,再将 要插入位置后面的全部记录读入内存,然后自插入位置写上(键入)要插入的新记录内容,之 后将文件指针移到下一个记录的开始处, 把已读入内存的那些记录重新写回文件中, 最后将 库文件的记录数加 1。 对于这两种操作,由于改变了记录数,因而要注意 1AH 的位置是否相应地调整了。 例子:在 Borland c 下编译成功,如果在其他编译器下不成功,因为 dos.h 不一样。只要改 写文件操作方法就好 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include <dos.h> #include <io.h> #define m_useridlen #define m_usernamelen #define m_arealen 10 30 20
起止字节 0 1~3 4~7 8~9 10~11 12~31
从第 32 个字节开始到 0DH 为止是字段描述区,每 32 个字节定义一个字段,包括字段名、 字段类型、字段长度、小数位数等。字段描述的各字节意义如表 2。 表 2 字段描述 起止字节 0~10 11 12~15 16 17 18~31 长 度 11 个字节 1 个字节 4 个字节 1 个字节 1 个字节 14 个字节 含 义 字段名 字段类型(ASCII 码) 字段数据在内存中的地址 字段长度(二进制数) 数值字段小数位数(二进制数) 保留字节
文件头长度=32+(32*定义的字段个数)+1 在 0DH 后面,紧接着存放数据记录。记录以定长 格式顺序存贮,每个记录的第一个字节是删除标识,有删除标记的记录,该字节是 2AH(对 应符号 “*”),无删除标记的记录,该字节为空格(20H)。每个记录的各字段之间没有分隔 符,记录无终止符,各种类型的数据均以 ASCII 码存放。数据记录之后为一个字节的文尾 标识(1AH)。
2.用 C 语言直接存取 DBF 数据库文件的方法
直接读取 DBF 数据库记录 知道了文件头的长度后,要想读取数据库中的记录,可先以“rb”方式打开该数据库文 件,然后将文件指针定位于文件头结束标志之后(即第一个记录的开始处),便可逐记录读取 该库文件的各记录数据。 2.2 直接更新 DBF 数据库记录 如果要更新 DBF 数据库文件中的某个记录或某个记录中的某字段的内容,可首先用 2.1
*/
char production_index; } field_element; typedef struct { char userid[m_useridlen]; char username[m_usernamelen]; char area[m_arealen]; } DBF_REC; typedef struct { char userid[m_useridlen+1]; char username[m_usernamelen+1]; char area[m_arealen+1]; } C_REC; dbf_head file_head; field_element *fields; DBF_REC dbfitem,tempitem; C_REC thisitem; int dbfopen(char *fname, int *fhdl){ unsigned tmp; while (_dos_open(fname, O_RDWR, fhdl)!=0) exit(0); _dos_read(*fhdl, &file_head, sizeof(dbf_head),&tmp); return(0); } void dbfclose(void){ _dos_close(fhandle); } void dbfseek(long recnum){ lseek(fhandle, (recnum-1)*file_head.rec_len + file_head.head_len, SEEK_SET); } void dbfinsert(C_REC crecord) { unsigned char c[4]={0,0,0,0}; c[3]*0x1000000 unsigned tmp; unsigned char buffer[256]; convC2DBF(crecord); dbfseek(file_head.no_recs);