高分求救,怎么从java里读dbf格式里的数据??

jcs5094 2004-10-26 11:02:25
现在 作一个接口,要从dbf里读数据,改该如何是好?
...全文
195 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
drugon 2004-11-05
  • 打赏
  • 举报
回复
dbf文件好象有专门的格式,前面有人说用ODBC不一定行的,因为它不是一个Database,所以不一定可以生成一个数据源,你先找到他的格式,然后以读文件的方式读,就可以把数据取出来。以前有一个这样的贴子,你找一下,可以找到的。
lenoli 2004-11-05
  • 打赏
  • 举报
回复
给我email
netsea_wangchao 2004-11-05
  • 打赏
  • 举报
回复
这是C语言实现的读取DBF文件的方法

#define MAXFIELD 255 /*字段的最大个数*/
unsigned long recordnum;/*记录号*/
unsigned long recordlen,structlen,filednum;/*记录长度,库结构长,字段数*/
FILE *fp;

struct
{
char name[50];/*字段名称*/
char type;/*字段类型*/
int length;/*字段长度*/
int decim;/*小数位数*/
}filed[MAXFIELD];

union
{
long i;/*存整形字段*/
double f;/*存实型字段*/
char s[255];/*存字符型字段*/
}f_value[MAXFIELD];

void clear();/*设置屏幕为图形方式*/
void get_head();/*读取数据库的结构信息*/
void go();/*移动记录指针*/
void duse();/*打开数据库*/
void readdata();/*读取记录*/
void dispdata();/*显示数据*/
void closedata();/*关闭数据库*/

#include <stdio.h>

main()
{
char *filename;
unsigned long i;
*filename = "YXDM.dbf";

duse(filename);

get_head(fp);

for(i = 0;i++;i < recordnum)
{
dispdata(fp,i);
}
closedata(fp);
}

#include<graphics.h>

void clear()
{
int graphdriver = DETECT;
int graphmode;
initgraph(&graphdriver,&graphmode,"");
}

void get_head(FILE *fp)
{
unsigned char ch[9];
int i;
fseek(fp,4,0);
fgets(ch,9,fp);
recordnum = ch[0] + 256 * ch[1] + 4096 * ch[2] + 65535 * ch[3];/*记录数*/
recordlen = ch[6] + 256 * ch[7];/*记录长度*/
structlen = ch[4] + 256 * ch[5];/*库说明的长度*/
filednum = (structlen - 32 -1 ) / 32;/*字段的个数*/
for(i = 0;i < filednum;i++)
{
fseek(fp,(i + 1) * 32,0);
fgets(filed[i].name,11,fp);/*取得字段名称*/
fseek(fp,(i + 1) * 32 + 11,0);
filed[i].type = fgetc(fp);/*取字段类型*/
fseek(fp,(i + 1) * 32 + 16,0);
ch[0] = fgec(fp);
filed[i].length = ch[0];/*取字段长度*/
fseek(fp,(i + 1) * 32 + 17,0);
fgets(ch,2,fp);
filed[i].decim = ch[0];/*取小数位数*/
}
}

void go(FILE *fp,unsigned long i)
{
if(fp == NULL)
{
printf("file not open\n");
getch();
return ;
}
fseek(fp,structlen + (i - 1) * recordlen,0);
}
void duse(char *filename)
{
if((fp = fopen(filename,"rwb")) == NULL)
{
printf("file can not open\n");
getch();
exit(1);
}
}

void readdata(FILE *fp,unsigned long rnum)
{
int j;
unsigned int lim;
char ch;
double ftemp;
if(rnum > recordnum)
{
printf("parameter error\n");
getch();
return ;
}
go(fp,rnum);
ch = fgetc(fp);
if(ch == '*')
{
printf("record had been delete");
return ;
}
j = 0;
lim = filednum;
while(j < lim)
{
fgets(f_value[j].s,filed[j].length + 1,fp);
if(filed[j].type == 'N')
{
ftemp = atof(f_value[j].s);
if(filed[j].decim > 0)
{
f_value[j].f = ftemp;
}
else
{
f_value[j].i = ftemp;
}
}
j++;
}
}

void dispdata(FILE *fp,unsigned long rnum)
{
int j;
unsigned int lim;
lim = filednum;
readdata(fp,rnum);
clear();
j = 0;
while(j < lim)
{
printf("%-20s:",filed[j].name);
if(filed[j].type == 'N')
{
if(filed[j].decim > 0)
printf("%f\n",f_value[j].f);
else
printf("%d\n",f_value[j].i);
}
else
printf("%s\n",f_value[j].s);
j++;
}
void closedata(FILE *fp)
{
if(fclose(fp))
{
printf("database close error\n");
exit(1)
}
}
}
zyatwh 2004-10-26
  • 打赏
  • 举报
回复
你在论坛里搜索,有很多相关贴子
zhangchenguang 2004-10-26
  • 打赏
  • 举报
回复
湘潭有个公司开发有DBF驱动,能够把DBF文件当作数据库中的一个表来使用的,啥公司,忘了,不过他们的开发包好像叫COM.HXTT....
jcs5094 2004-10-26
  • 打赏
  • 举报
回复
在pb里存储成dbase2就读不出来,dbase3就能读出来,这是怎么回事啊??
jcs5094 2004-10-26
  • 打赏
  • 举报
回复
lhz_9712(晃晃悠悠) :
能不能详细一点,最好给点源代码!
lhz_9712 2004-10-26
  • 打赏
  • 举报
回复
读取excel,text,dbf我都用这种方法做过。

不过你要注意的是,每一个dbf是看成一张表,而对于excel中,每一个sheet看成一张表
lhz_9712 2004-10-26
  • 打赏
  • 举报
回复
用该dbf做一个odbc的数据源,然后用odbc jdbc桥来读数据。

别说dbf,就是text也可以。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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