请教用标准C插入数据到DBF数据库中的操作方法?

dengyiwolf 2006-12-20 02:44:51

1. 请教用标准C插入数据到DBF数据库中的操作方法?请讲讲方法,最好有实例!(最好用标准库函数)

2. 一采集仪从串口接收到数据,经过处理,就直接写入DBF库中.这样边做数据处理,边从串口采集会不会 出现问题呀?
...全文
323 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
dengyiwolf 2007-01-09
  • 打赏
  • 举报
回复
没人回复,那就只有结贴了。。。

哎,还好今天已经自行解决了...
dengyiwolf 2006-12-31
  • 打赏
  • 举报
回复
dengyiwolf@163.com
xiong_xiaoming 2006-12-29
  • 打赏
  • 举报
回复
告诉邮件地址,发给你一个很久前C语言的def文件操作。
cmouse 2006-12-22
  • 打赏
  • 举报
回复
找一下codebase这个东东, 也许对你有用!
cmouse 2006-12-22
  • 打赏
  • 举报
回复
插入DBF很容易的, 不过每插入一条就要重写索引表.....不好搞, 没搞过!
dengyiwolf 2006-12-22
  • 打赏
  • 举报
回复
有了代码,也没有知道吗?
dengyiwolf 2006-12-21
  • 打赏
  • 举报
回复
没有高手能够帮我解决吗?
dengyiwolf 2006-12-21
  • 打赏
  • 举报
回复
用open,read,write,lseek 这些函数来读写.

读取都行了,就是插入数据始终都不行呀。
Tiny_yu 2006-12-21
  • 打赏
  • 举报
回复
以上代码,在VC6.0下编译通过,希望大家帮我写一下插入数据的代码
Tiny_yu 2006-12-21
  • 打赏
  • 举报
回复

void main(void)
{
Data_Table table;
TaiQu_Info taiqu;
int i=0;

int fh;
int fw;

OpenTable("E:\\Excise_SingleLink\\taiquinfo.dbf",&table);

printf("m_CurrentRecord %d\n",table.m_CurrentRecord );
printf("m_FieldCount %d\n",table.m_FieldCount );
printf("m_FileHandle %d\n",table.m_FileHandle );
printf("m_Header %s\n",table.m_Header.m_LastUpdate);
printf("m_Memo %d\n",table.m_Memo );
printf("m_MemoHandle %d\n",table.m_MemoHandle );
printf("m_RecordIndex %d\n",table.m_RecordIndex );
printf("m_TableName %s\n",table.m_TableName );
printf("m_VectorCount %d\n",table.m_VectorCount );

printf("pVectorRecord %d\n",table.pVectorRecord );
printf("Record_Count %d\n",table.m_Header.m_RecordCount );
printf("Record_Len %d\n",table.m_Header.m_RecordLen );

//赋值

strcpy(taiqu.m_PhoneNum1,"13758127653");
strcpy(taiqu.m_PhoneNum2,"13758127651");
strcpy(taiqu.m_BPS,"115200");

taiqu.m_Level =1;
taiqu.m_MacAddr =1;
taiqu.m_BEEP =1;
taiqu.m_MaxValue =533;

fh=open("E:\\Excise_SingleLink\\taiquinfo.dbf", O_RDWR|O_BINARY|_O_CREAT, 0);
if (fh==3)
{
table.m_FileHandle =fh;
//lseek(fh ,32+7*32+263+2*sizeof(TaiQu_Info),SEEK_SET);
//lseek(fh,0x263,SEEK_SET);
// lseek(table.m_FileHandle,table.m_Header.m_RecordLen * //(table.m_RecordIndex +2-1),SEEK_CUR);


lseek(table.m_FileHandle,
table.m_Header.m_FirstPos +
table.m_Header.m_RecordLen * 2+1,
SEEK_SET);
fw=write(fh, &taiqu, (table.m_Header.m_RecordLen));
if (fw==-1)
{
close(fh);
return;
}


}
else
{
printf("can't open file!");
return;
}
}
//DBF文件结构,文件名为 taiquinfo.dbf
phonenum1 phonenum2 bps beep macaddr level maxvalue

13758127643 13758127644 115200 1 1 1 566
13758127633 13758127651 57600 1 1 1 667


dengyiwolf 2006-12-21
  • 打赏
  • 举报
回复
/************************************************************************
* FileName: dbf.c
*************************************************************************/


#include "..\\DBF.H"

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <dos.h>
#include <share.h>
#include <fcntl.h>
#include <string.h>


Field_Struct *tblFields;
TaiQu_Info taiqu;

/**********************************
函数: InitDataTable
功能: 初始化Data_Table表结构
输入: 表结构指针
输出: 初始化后的表结构
返回: 1:成功;
*********************************/
int InitDataTable(Data_Table *vDataTable)
{
vDataTable->m_FileHandle = -1;
vDataTable->m_TableName = NULL;
vDataTable->m_MemoHandle = -1;
vDataTable->m_FieldCount = 0;
vDataTable->m_RecordIndex = -1;
vDataTable->pVectorField = NULL;
vDataTable->pVectorRecord = NULL;
vDataTable->m_VectorCount = -1;
vDataTable->m_CurrentRecord.m_DeletedFlag = 0x20;
vDataTable->m_CurrentRecord.m_RecordBuffer = NULL;
vDataTable->m_Header.m_FileType = 0x30;
memcpy(vDataTable->m_Header.m_LastUpdate, "000000", 7);
vDataTable->m_Header.m_FirstPos = 0L;
vDataTable->m_Header.m_RecordCount = 0L;
vDataTable->m_Header.m_RecordLen = 0L;
vDataTable->m_Header.m_TableFlag = 0L;
vDataTable->m_Header.m_CodePage = 0L;
return 1;
}


/**********************************
函数: ReadTableHeader
功能: 读取由Data_Table提供的表文件的头信息
输入: 表结构指针
输出: 修改表结构中表头结构的内容
返回: 1:成功;
-1: 文件未打开;
-2: lseek函数错误;
-3:read函数错误
*********************************/
static int ReadTableHeader(Data_Table *vDataTable)
{
Table_Header*tblHeader;
int fh;
long pos;
unsigned char ls_buf[8];
int i;
long bytesRead;
// char * l_FileName;
// __int16 n;

fh = vDataTable->m_FileHandle;
tblHeader = &(vDataTable->m_Header);
if (fh == -1)
{
return -1;
}
if ((pos = lseek(fh, 0L, SEEK_SET)) == -1)
{
return -2;
}
for (i = 0; i < 8; i++)
ls_buf[i] = 0L;
if ((bytesRead = read(fh, ls_buf, 1)) <= 0)
{
return -3;
}
tblHeader->m_FileType = ls_buf[0];

bytesRead = read(fh, ls_buf, 3);
if (bytesRead <= 0)
{
return -3;
}
sprintf((char *) ls_buf, "%.2d%.2d%.2d", ls_buf[0], ls_buf[1], ls_buf[2]);
memcpy(tblHeader->m_LastUpdate, ls_buf, 6);
tblHeader->m_LastUpdate[6] = 0L;

bytesRead = read(fh, ls_buf, 4);
if (bytesRead <= 0)
{
return -3;
}
tblHeader->m_RecordCount = (unsigned long) (ls_buf[0]) +
((unsigned long) (ls_buf[1]) << 8) +
((unsigned long) (ls_buf[2]) << 16) +
((unsigned long) (ls_buf[3]) << 24);

bytesRead = read(fh, ls_buf, 2);
if (bytesRead <= 0)
{
return -3;
}
tblHeader->m_FirstPos = (unsigned int) (ls_buf[0]) +
((unsigned int) (ls_buf[1]) << 8);

bytesRead = read(fh, ls_buf, 2);
if (bytesRead <= 0)
{
return -3;
}
tblHeader->m_RecordLen = (unsigned int) ls_buf[0] +
((unsigned int) (ls_buf[1]) << 8);

lseek(fh, 28, SEEK_SET);
read(fh, ls_buf, 1);
tblHeader->m_TableFlag = (unsigned char) (ls_buf[0]);

read(fh, ls_buf, 1);
tblHeader->m_CodePage = (unsigned char) (ls_buf[0]);
return 1;
}



/**********************************
函数: ReadTableFields
功能: 读取由Data_Table提供的表文件的字段信息
输入: 表结构指针
输出: 修改表结构中字段结构的内容
返回: 1: 成功;
-1: 文件未打开;
-2: lseek函数错误;
-3: read函数错误
-4: memory allocate error.
*********************************/
static int ReadTableFields(Data_Table *vDataTable)
{
int fh;
long pos;
unsigned char ls_buf[32];
int i;
long bytesRead;
long l_num;
Table_Header*tblHeader;


fh = vDataTable->m_FileHandle;
if (fh == -1)
{
return -1;
}
tblHeader = &(vDataTable->m_Header);
for (i = 0; i < 32; i++)
ls_buf[i] = '\0';

if (tblHeader->m_FileType == 3)
{
//0x03:FoxBase+/dBase III PLUS, 无备注
vDataTable->m_FieldCount = (tblHeader->m_FirstPos - 32 - 1) / 32;
}
else
{
//0x30:Visual Foxpro
vDataTable->m_FieldCount = (tblHeader->m_FirstPos - 32 - 1 - 263) / 32;
}

vDataTable->pVectorField = (Field_Struct *)
malloc(sizeof(Field_Struct) * vDataTable->m_FieldCount);
if (vDataTable->pVectorField == NULL)
{
return -4;
}
tblFields = vDataTable->pVectorField;

for (l_num = 0; l_num < vDataTable->m_FieldCount; l_num++)
{
pos = lseek(fh, l_num * 32 + 32, SEEK_SET);
if (pos == -1)
{
return -2;
}
bytesRead = read(fh, ls_buf, 11);
if (bytesRead <= 0)
{
return -3;
}
memcpy(tblFields[l_num].m_FieldName, ls_buf, 11);

read(fh, ls_buf, 1);
tblFields[l_num].m_FieldType = ls_buf[0];

read(fh, ls_buf, 4);
tblFields[l_num].m_Offset = (unsigned long) ls_buf[0] +
((unsigned long) ls_buf[1] << 8) +
((unsigned long) ls_buf[2] << 16) +
((unsigned long) ls_buf[3] << 24);

read(fh, ls_buf, 1);
tblFields[l_num].m_FieldLength = ls_buf[0];

read(fh, ls_buf, 1);
tblFields[l_num].m_FixLength = ls_buf[0];

read(fh, ls_buf, 1);
tblFields[l_num].m_FieldFlag = ls_buf[0];
} //end for
return 1;
}


/**********************************
函数:
功能: 打开一张表(即:一个dbf文件)。
输入:
输出:
返回:
*********************************/
int OpenTable(const char *vFileName, Data_Table *vDataTable)
{
InitDataTable(vDataTable);
if ((vDataTable->m_FileHandle = open(vFileName,"rb",0)) == -1)
{
return -1;
}
vDataTable->m_TableName = (char *) malloc(strlen(vFileName) + 1);
if (vDataTable->m_TableName == NULL)
{
close(vDataTable->m_FileHandle);
return -1;
}
memcpy(vDataTable->m_TableName, vFileName, strlen(vFileName) + 1);
//vDataTable->m_TableName[strlen(vFileName)] = 0L;

ReadTableHeader(vDataTable);
ReadTableFields(vDataTable);

vDataTable->m_CurrentRecord.m_RecordBuffer = (char *)
malloc(vDataTable->m_Header.m_RecordLen);//, 615
if (NULL == vDataTable->m_CurrentRecord.m_RecordBuffer)
{
close(vDataTable->m_FileHandle);
return -1;
}
vDataTable->m_CurrentRecord.m_DeletedFlag = 0x0;
vDataTable->m_RecordIndex = -1;
// GetFirstRecord(vDataTable);

vDataTable->pVectorRecord = NULL;
close(vDataTable->m_FileHandle);
return 1;
}
dengyiwolf 2006-12-21
  • 打赏
  • 举报
回复
以下是我的代码,VC6.0编译通过,麻烦大家看看后,帮我写一个插入数据的代码

/************************************************************************
*FileName: dbf.h
************************************************************************/
typedef struct Table_Header {
unsigned char m_FileType;
unsigned char m_LastUpdate[7];
int m_RecordCount;
int m_FirstPos;
int m_RecordLen;
unsigned char m_TableFlag;
unsigned char m_CodePage;
}Table_Header;


typedef struct Field_Struct{
char m_FieldName[12];
char m_FieldType;
int m_Offset;
int m_FieldLength;
int m_FixLength;
int m_FieldFlag;
}Field_Struct;


typedef struct Record_Struct{
char m_DeletedFlag;
char* m_RecordBuffer;
}Record_Struct;


typedef struct Memo_Header{
int m_MemoHandle;
int m_NextBlock;
int m_BlockSize;
}Memo_Header;


typedef struct Data_Table{
int m_FileHandle;//文件句柄
char* m_TableName; //文件名
int m_MemoHandle;//备注文件句柄
Table_Header m_Header;//表头
int m_FieldCount;//字段数
int m_RecordIndex;//记录索引
Record_Struct m_CurrentRecord;//当前记录
Field_Struct* pVectorField;//字段指针
Record_Struct* pVectorRecord;//记录指针
int m_VectorCount;//
struct Memo_Header * m_Memo;//备注头
}Data_Table;


typedef struct Memo_Block{
int m_BlockFlag;
int m_BlockLength;
char* m_BlockContent;
}Memo_Block;


typedef struct __RTC_{
int year;
int month;
int day;
int hour;
int minute;
int second;
}__RTC_, *P__RTC_;

//台区信息表
typedef struct TaiQu_Info{
char m_PhoneNum1[11];
char m_PhoneNum2[11];
char m_BPS[6];
int m_BEEP;
int m_MacAddr;
int m_Level;
int m_MaxValue;
}TaiQu_Info;

dengyiwolf 2006-12-21
  • 打赏
  • 举报
回复
文件头都已经明白了,但是就是写不进去呀!
对了,忘记了,真的还要写索引文件.
不过也是需要插入编号到索引文件中去,郁闷中...
lann64 2006-12-21
  • 打赏
  • 举报
回复
dbf也不算难了,结构很简单的。
开始是一块字段定义的头,头的长度,每个字段名、字段长度都简单记录着。然后就是一条条记录。顺着写就是了。
如果不用自己写索引文件应该是很简单的事。
自己查一下dbf结构就可以写了。不需要别人帮忙的。
OpenHero 2006-12-21
  • 打赏
  • 举报
回复
自己插入有点难,,得自己解析dbf的结构
最好还是用系统提供的接口吧
jixingzhong 2006-12-20
  • 打赏
  • 举报
回复
2 考虑速度啊,不要产生数据淹没就可以了,
就是保证发送方发送数据不能超过接收方处理极限,
否则数据就 ....
jixingzhong 2006-12-20
  • 打赏
  • 举报
回复
标准库,
那就郁闷了 ~~

通过 COM 操作吧 ...
MS 提供了接口。
lann64 2006-12-20
  • 打赏
  • 举报
回复
1.dbf是个公开结构的文件,查查dbf文件结构就可以了。
2.主要看速度了,不会产生数据丢失就没问题。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧