求救:在delphi程序中,用adoquery把dbf文件导入到access数据库,中文字段会出现乱码

时间:2021-09-27 07:47:47
各位大侠,小弟刚接触dbf文件不久,出现上面的问题,请赐教
dbf表结构与access表结构是一样的
如果字段是中文,导入到access表中字段就变成乱码
前台delphi程序调用access数据库的时候字段也是乱码

//复制一个空的access数据库到data目录下面
  CopyFile(PChar(gExePath + 'DataModle\ItemDistribute.mdb'), PChar(gExePath + 'Data\ItemDistribute.mdb'), False);
  MemInfor.Lines.Add('开始把上传数据导入到access数据库...');
  qrydistribute.ConnectionString :=
  'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='''+PChar(gExePath + 'Data\ItemDistribute.mdb')+''';Persist Security Info=False';
  qrydistribute.Close;
  //导入考场表
  qrydistribute.SQL.Clear;
  qrydistribute.SQL.Add('insert into 考场表(Kc_h,Ss_h,Ss_rs,Bz) select Kc_h,Ss_h,Ss_rs,Bz from 考场表 in '''+PChar(sourcenew)+''' ''dbase 5.0;''');
  qrydistribute.ExecSQL;

20 个解决方案

#1


access数据库的字段类型有问题吧?
存放中文的只能是 char、text 而不能是 nchar、ntext

#2


引用 1 楼 xuzuning 的回复:
access数据库的字段类型有问题吧?
存放中文的只能是 char、text 而不能是 nchar、ntext

你好,xuzuning
我刚查看了access数据库,中文字段的数据类型都设置的是文本

#3


DBF是怎么建立的,直接在ACCESS中运行结果如何

#4


看一下从 dbf 读出,导入 Access 之前是不是乱码。

#5


引用 3 楼 wwwwb 的回复:
DBF是怎么建立的,直接在ACCESS中运行结果如何

你好,wwwb
dbf是通过vf程序建立的
直接在access中运行没有乱码

还有一个问题:
如果sql语句可以直接操作多个dbf表关联查询的话,我就不用把dbf导入到access数据库中了
现在就是由于要对多个表关联查询并处理,所以我的想法是:
1.把dbf导入到access数据库中
2.在access中把数据处理好
3.再把access数据导入到dbf文件中
4.完成
你看这样对吗?

#6


引用 4 楼 apple_8180 的回复:
看一下从 dbf 读出,导入 Access 之前是不是乱码。

是正常的,不是乱码

#7


sql语句可以直接操作多个dbf表关联查询
可以的,你说一下要求

#8


直接运行:
select * from [dbase 5.0;database=r:\temp].a a1 left join 
[dbase 5.0;database=r:\temp].b a2 on a1.id=a2.id

#9


引用 7 楼 apple_8180 的回复:
sql语句可以直接操作多个dbf表关联查询
可以的,你说一下要求

我是这样写的,无法执行
就是2个表根据考生号关联,取出b表的考生姓名
你帮忙看下哪里的错误?

qrydistribute.ConnectionString :=
  'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='''+PChar(gExePath + 'Data\ItemDistribute.mdb')+''';Persist Security Info=False';
  qrydistribute.Close;

  //导入考生信息表
  qrydistribute.SQL.Clear;
  qrydistribute.SQL.Add('insert into 考生信息表(Ks_h,Xm,Kc_h) select a.Ks_h,b.Xm,a.Zx_h from 考生信息表 in '''+PChar(sourcenew)+''' ''dbase 5.0;'' a,'+'考生姓名表 in '''+PChar(sourcenew)+''' ''dbase 5.0;'' b where a.ks_h=b.ks_h');
  qrydistribute.ExecSQL;

#10


引用 8 楼 wwwwb 的回复:
直接运行:
select * from [dbase 5.0;database=r:\temp].a a1 left join 
[dbase 5.0;database=r:\temp].b a2 on a1.id=a2.id

谢谢
我试一下
我的adoquery连接的是access数据库

#11


引用 8 楼 wwwwb 的回复:
直接运行:
select * from [dbase 5.0;database=r:\temp].a a1 left join 
[dbase 5.0;database=r:\temp].b a2 on a1.id=a2.id


qrydistribute.SQL.Clear;                                                             qrydistribute.SQL.Add(' select * from [dbase 5.0;database='+PChar(sourcenew)+'].考生信息表 ');
  qrydistribute.Open;
  ShowMessage(IntToStr(qrydistribute.RecordCount));

这样直接回报错误:
project raised exception class eoleexception with message '不正常地定义参数对象,提供了不一致或不完整的信息‘

#12


SQL中的内容是什么,直接在ACCESS中运行结果,sourcenew是什么内容

#13


你的写法不懂,vfp 中可以直接:
Select a.Ks_h,b.Xm,a.Zx_h From 考生信息表 a Left Join 考生姓名表 b On a.ks_h=b.ks_h

Select a.Ks_h,b.Xm,a.Zx_h From 考生信息表 a Inner Join 考生姓名表 b On a.ks_h=b.ks_h

#14


你改用:
用oledb for vfp(如9.0 Microsoft OLE DB Provider for Visual FoxPro 9.0)连接,可支持vfp的大部分命令
不是oledb for odbc

oledb for vfp下载地址:
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=14839
Version: 1.2
Date Published: 5/16/2008 
Language: English 

File Name  Size  
vfpoledb.msm  829 KB
VFPOLEDBSetup.msi  1.0 MB (安装此项)

安装完oledb for vfp后,建一ado连接,选oledb for vfp,如果是数据库,连接到数据库,如果是*表,连接到*表所在目录,然后建一ado command或用ado连接的execute方法

然后用
Select a.Ks_h,b.Xm,a.Zx_h From 考生信息表 a Left Join 考生姓名表 b On a.ks_h=b.ks_h

Select a.Ks_h,b.Xm,a.Zx_h From 考生信息表 a Inner Join 考生姓名表 b On a.ks_h=b.ks_h
试试,即不用 Access 中转了。

#15


引用 12 楼 wwwwb 的回复:
SQL中的内容是什么,直接在ACCESS中运行结果,sourcenew是什么内容


sourcenew是当前要操作dbf文件的路径

#16


引用 14 楼 apple_8180 的回复:
你改用:
用oledb for vfp(如9.0 Microsoft OLE DB Provider for Visual FoxPro 9.0)连接,可支持vfp的大部分命令
不是oledb for odbc

oledb for vfp下载地址:
http://www.microsoft.com/download/en/details.aspx?displaylang=en&……


十分感谢
我这个程序做好之后发给用户
用户端需要安装oledb for odbc吗?
这个程序是发给用户使用的

#17


引用 16 楼 woshisqlaihaozhe2 的回复:
十分感谢
我这个程序做好之后发给用户
用户端需要安装oledb for odbc吗?
这个程序是发给用户使用的
需要安装

#18


引用 16 楼 woshisqlaihaozhe2 的回复:
引用 14 楼 apple_8180 的回复:
你改用:
用oledb for vfp(如9.0 Microsoft OLE DB Provider for Visual FoxPro 9.0)连接,可支持vfp的大部分命令
不是oledb for odbc

oledb for vfp下载地址:
http://www.microsoft.com/download/en/details……

写错了,是oledb for vfp用户端必须要安装吗?

#19



上传你的DBF到www.access911.net/csdn
,用WINRAR压缩

#20


引用 19 楼 wwwwb 的回复:
上传你的DBF到www.access911.net/csdn
,用WINRAR压缩

多谢了
我现在采用直接操作dbf的方法暂时没有发现有乱码
可能是dbf和access表转换的时候由于字段编码的问题导致的

#1


access数据库的字段类型有问题吧?
存放中文的只能是 char、text 而不能是 nchar、ntext

#2


引用 1 楼 xuzuning 的回复:
access数据库的字段类型有问题吧?
存放中文的只能是 char、text 而不能是 nchar、ntext

你好,xuzuning
我刚查看了access数据库,中文字段的数据类型都设置的是文本

#3


DBF是怎么建立的,直接在ACCESS中运行结果如何

#4


看一下从 dbf 读出,导入 Access 之前是不是乱码。

#5


引用 3 楼 wwwwb 的回复:
DBF是怎么建立的,直接在ACCESS中运行结果如何

你好,wwwb
dbf是通过vf程序建立的
直接在access中运行没有乱码

还有一个问题:
如果sql语句可以直接操作多个dbf表关联查询的话,我就不用把dbf导入到access数据库中了
现在就是由于要对多个表关联查询并处理,所以我的想法是:
1.把dbf导入到access数据库中
2.在access中把数据处理好
3.再把access数据导入到dbf文件中
4.完成
你看这样对吗?

#6


引用 4 楼 apple_8180 的回复:
看一下从 dbf 读出,导入 Access 之前是不是乱码。

是正常的,不是乱码

#7


sql语句可以直接操作多个dbf表关联查询
可以的,你说一下要求

#8


直接运行:
select * from [dbase 5.0;database=r:\temp].a a1 left join 
[dbase 5.0;database=r:\temp].b a2 on a1.id=a2.id

#9


引用 7 楼 apple_8180 的回复:
sql语句可以直接操作多个dbf表关联查询
可以的,你说一下要求

我是这样写的,无法执行
就是2个表根据考生号关联,取出b表的考生姓名
你帮忙看下哪里的错误?

qrydistribute.ConnectionString :=
  'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='''+PChar(gExePath + 'Data\ItemDistribute.mdb')+''';Persist Security Info=False';
  qrydistribute.Close;

  //导入考生信息表
  qrydistribute.SQL.Clear;
  qrydistribute.SQL.Add('insert into 考生信息表(Ks_h,Xm,Kc_h) select a.Ks_h,b.Xm,a.Zx_h from 考生信息表 in '''+PChar(sourcenew)+''' ''dbase 5.0;'' a,'+'考生姓名表 in '''+PChar(sourcenew)+''' ''dbase 5.0;'' b where a.ks_h=b.ks_h');
  qrydistribute.ExecSQL;

#10


引用 8 楼 wwwwb 的回复:
直接运行:
select * from [dbase 5.0;database=r:\temp].a a1 left join 
[dbase 5.0;database=r:\temp].b a2 on a1.id=a2.id

谢谢
我试一下
我的adoquery连接的是access数据库

#11


引用 8 楼 wwwwb 的回复:
直接运行:
select * from [dbase 5.0;database=r:\temp].a a1 left join 
[dbase 5.0;database=r:\temp].b a2 on a1.id=a2.id


qrydistribute.SQL.Clear;                                                             qrydistribute.SQL.Add(' select * from [dbase 5.0;database='+PChar(sourcenew)+'].考生信息表 ');
  qrydistribute.Open;
  ShowMessage(IntToStr(qrydistribute.RecordCount));

这样直接回报错误:
project raised exception class eoleexception with message '不正常地定义参数对象,提供了不一致或不完整的信息‘

#12


SQL中的内容是什么,直接在ACCESS中运行结果,sourcenew是什么内容

#13


你的写法不懂,vfp 中可以直接:
Select a.Ks_h,b.Xm,a.Zx_h From 考生信息表 a Left Join 考生姓名表 b On a.ks_h=b.ks_h

Select a.Ks_h,b.Xm,a.Zx_h From 考生信息表 a Inner Join 考生姓名表 b On a.ks_h=b.ks_h

#14


你改用:
用oledb for vfp(如9.0 Microsoft OLE DB Provider for Visual FoxPro 9.0)连接,可支持vfp的大部分命令
不是oledb for odbc

oledb for vfp下载地址:
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=14839
Version: 1.2
Date Published: 5/16/2008 
Language: English 

File Name  Size  
vfpoledb.msm  829 KB
VFPOLEDBSetup.msi  1.0 MB (安装此项)

安装完oledb for vfp后,建一ado连接,选oledb for vfp,如果是数据库,连接到数据库,如果是*表,连接到*表所在目录,然后建一ado command或用ado连接的execute方法

然后用
Select a.Ks_h,b.Xm,a.Zx_h From 考生信息表 a Left Join 考生姓名表 b On a.ks_h=b.ks_h

Select a.Ks_h,b.Xm,a.Zx_h From 考生信息表 a Inner Join 考生姓名表 b On a.ks_h=b.ks_h
试试,即不用 Access 中转了。

#15


引用 12 楼 wwwwb 的回复:
SQL中的内容是什么,直接在ACCESS中运行结果,sourcenew是什么内容


sourcenew是当前要操作dbf文件的路径

#16


引用 14 楼 apple_8180 的回复:
你改用:
用oledb for vfp(如9.0 Microsoft OLE DB Provider for Visual FoxPro 9.0)连接,可支持vfp的大部分命令
不是oledb for odbc

oledb for vfp下载地址:
http://www.microsoft.com/download/en/details.aspx?displaylang=en&……


十分感谢
我这个程序做好之后发给用户
用户端需要安装oledb for odbc吗?
这个程序是发给用户使用的

#17


引用 16 楼 woshisqlaihaozhe2 的回复:
十分感谢
我这个程序做好之后发给用户
用户端需要安装oledb for odbc吗?
这个程序是发给用户使用的
需要安装

#18


引用 16 楼 woshisqlaihaozhe2 的回复:
引用 14 楼 apple_8180 的回复:
你改用:
用oledb for vfp(如9.0 Microsoft OLE DB Provider for Visual FoxPro 9.0)连接,可支持vfp的大部分命令
不是oledb for odbc

oledb for vfp下载地址:
http://www.microsoft.com/download/en/details……

写错了,是oledb for vfp用户端必须要安装吗?

#19



上传你的DBF到www.access911.net/csdn
,用WINRAR压缩

#20


引用 19 楼 wwwwb 的回复:
上传你的DBF到www.access911.net/csdn
,用WINRAR压缩

多谢了
我现在采用直接操作dbf的方法暂时没有发现有乱码
可能是dbf和access表转换的时候由于字段编码的问题导致的

#21