高分求救,怎么从java里读dbf格式里的数据?? 用该dbf做一个odbc的数据源,然后用odbc jdbc桥来读数据。别说dbf,就是text也可以。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 读取excel,text,dbf我都用这种方法做过。不过你要注意的是,每一个dbf是看成一张表,而对于excel中,每一个sheet看成一张表 lhz_9712(晃晃悠悠) :能不能详细一点,最好给点源代码! 在pb里存储成dbase2就读不出来,dbase3就能读出来,这是怎么回事啊?? 湘潭有个公司开发有DBF驱动,能够把DBF文件当作数据库中的一个表来使用的,啥公司,忘了,不过他们的开发包好像叫COM.HXTT.... 这是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) } }} dbf文件好象有专门的格式,前面有人说用ODBC不一定行的,因为它不是一个Database,所以不一定可以生成一个数据源,你先找到他的格式,然后以读文件的方式读,就可以把数据取出来。以前有一个这样的贴子,你找一下,可以找到的。 如何比较类和接口是不是继承自同样的接口 二维数组可不可以单独指定列的长度? 求助:java环境变量始终 配置不成功! 相当诧异 为什么会这样 疑惑 ,请高人指点?关于 if(Scheckrq.equals("chk_period")) 这样的问题 小弟初学java的多线程问题,向高手请教,急救........ 如何取得(保存到)文本中二行的值! GregorianCalendar类问题 怎么把查询结果都显示出来 JAVA中关于倍数问题,怎么表达? 急!~ 写文件时,换行怎么做? 请问怎么样单步运行一段Java代码? 怎样将asc码的文件转成ebcdid编码的文件?(在线等待)
能不能详细一点,最好给点源代码!
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)
}
}
}