急急急~~~ 向各位达人请教一下VC ODBC 读取EXCEL出现乱码的的问题

jjiaming 2008-05-05 10:00:34
RT,EXCEL表中有英文、中文、阿拉伯文, 读取英语和中文没有问题,但读取阿拉伯文却全是问号(注,项目已经使用UNICODE宏),小弟愚昧, 各位达人请出招!
...全文
210 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jjiaming 2008-05-30
  • 打赏
  • 举报
回复
问题解决了 使用了OLE方式读取就可以了 呵呵 
lifeworking 2008-05-06
  • 打赏
  • 举报
回复
楼主,我也遇到同样的问题,一样关注!!!!!!
jjiaming 2008-05-05
  • 打赏
  • 举报
回复
to laiyiling:

刚刚已经按照你给的网址改过代码了, 调试跟踪发现nSQLType的值居然是12(SQL_VARCHAR),难怪阿拉伯文无法读出来 但奇怪的是为什么是SQL_VARCHAR呢 是什么地方没有设置好吗
Kudeet 2008-05-05
  • 打赏
  • 举报
回复
好好读读下面的几篇文章,应该很有用的。

BUG: CRecordset::GetTextLen returns an incorrect length for UNICODE data when you use MFC ODBC with the SQL Server ODBC driver
http://support.microsoft.com/kb/249803

PRB: "Numeric Value Out of Range" Error when Calling GetFieldValue and Using SQL UNION
http://support.microsoft.com/kb/236786
Kudeet 2008-05-05
  • 打赏
  • 举报
回复
查了很多的微软知识库文件,发现了一些猫腻。

调用GetFieldValue之前,你先用CRecordset::GetTextLen看看他返回的字符串的长度, 如果长度不对,那就说明是MFC的ODBC封装可能出了问题,估计你需要重载CRecordset类的GetFieldValue方法
BUbuWander 2008-05-05
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1733
是不是这篇后面说的

为工程添加UNICODE和_UNICODE预处理选项 的问题呢
jjiaming 2008-05-05
  • 打赏
  • 举报
回复
将EXCEL内容用流读出来? 不好意思 小弟功力太浅,请问如果用流将EXCEL内容读出来
Kudeet 2008-05-05
  • 打赏
  • 举报
回复
如果阿拉伯文是多字节形式,可能是转换过程中的错误,你首先可以尝试将EXCEL内容用流读出来,然后用接口方法IMultiLanguage2::DetectCodepageInIStream来检查这段字符流的编码方式,转换再根本不同的编码进行转换.
jjiaming 2008-05-05
  • 打赏
  • 举报
回复
excel中的中文是ANSI还是UNICODE?? 不懂是什么意思
VC中读取中文跟阿拉伯文的的代码是一样的,并没有做区分

CDatabase database;
CString sSql;
CString sItem1, sItem2;
CString sDriver = _T("MICROSOFT EXCEL DRIVER (*.XLS)");
CString sDsn;
CString sFile = "C:\\XX.xls";// 将被读取的Excel文件名

// 创建进行存取的字符串
sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';Auto Translate=false;DBQ=%s"), sDriver, sFile);

try
{
// 打开数据库,建立与这个Excel对应的Database
database.Open(NULL, false, false, sDsn);
CRecordset recset(&database);
// 设置读取的查询语句.demo.xls并非文件名,需要在excel中进行//设置,具体文章最后有讲
sSql = _T("SELECT * from stringdata");
// 执行查询语句,打开表格
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
// 获取查询结果
int count = recset.GetRecordCount();
CString data;
while (!recset.IsEOF())
{
//读取Excel内部数值
for(int i = 0; i < 5; i++)
{
recset.GetFieldValue(i, data);
TRACE(data);
}
TRACE(_T("\n"));
// 移到下一行
recset.MoveNext();
}
// 关闭数据库
database.Close();
}
catch(CDBException e)
{
// 数据库操作产生异常时...
AfxMessageBox("数据库错误: " + e.m_strError);
}
内存泄漏 2008-05-05
  • 打赏
  • 举报
回复
你在excel中的中文是ANSI还是UNICODE?? VC中分别是怎么读取中文跟阿拉伯文的??
jjiaming 2008-05-05
  • 打赏
  • 举报
回复
还是不行 哎
scq2099yt 2008-05-05
  • 打赏
  • 举报
回复
up
Kudeet 2008-05-05
  • 打赏
  • 举报
回复
不知道是不是GetFieldValue的问题,你看看,用GetFieldValue(_T(""), xxx)); //用UNICODE的字符串做参数试试,你可以看看MFC/SRC/DBCORE.CPP的代码,看看他是怎么样封装的,我在网上看到有人说MFC的ODBC一直到8.0都有UNICODE支持的问题,但是我不确认。另外,你看看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel下关于ODBC驱动的一些设置,看看他是不是有问题,他也能控制ODBC的运行方式。

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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