新手求助

yfz503640916 2015-05-18 10:35:12
用MFC创建了一个数据库。将文件的路劲读取出来存入到表格中,然后再读取出来,但总是遇到问题。如,“D:\我的文档\1.bmp”这样的路径我先保存在CString的对象中,转换为_variant_t,存入数据库表里面,取出来时,再转换为CString类,总是只能取出“D”呢。
...全文
202 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yfz503640916 2015-05-18
  • 打赏
  • 举报
回复
引用 5 楼 worldy 的回复:
直接对 varFileName的指针直接使用WideCharToMultiByte转换回ansi不要转bstr_t,回来的肯定是bstr_t的,你再转为bstr_t.算是怎么回事?
直接使用varFilePath的指针的话就会报错啊:1>c:\users\administrator\desktop\rebuild2\rebuild1\rebuild1dlg.cpp(1377): error C2664: “WideCharToMultiByte”: 不能将参数 3 从“_variant_t *”转换为“LPCWSTR”
worldy 2015-05-18
  • 打赏
  • 举报
回复
直接对 varFileName的指针直接使用WideCharToMultiByte转换回ansi不要转bstr_t,回来的肯定是bstr_t的,你再转为bstr_t.算是怎么回事?
yfz503640916 2015-05-18
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
读回的数据,你再转回-bstr_t干吗? lz你不能贴你的大妈吗?干吗要贴图?
_variant_t varFileName;
	_variant_t varFileStatus;
	_variant_t varFilePath;
	//_variant_t varOrder;
	CString SFileName,SFileStatus,SFilePath;
	int i=0;
	db.Open(DbFilepath);
	Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DataTable",0);
	while(!Dbset.IsEOF())//如果记录集已经位于最后一条记录之后,IsEof返回非零值
	{
		varFileName=Dbset.GetFieldValue("FileName");//将数据库里的文件读出来
		varFileStatus=Dbset.GetFieldValue("FileStatus");
		varFilePath=Dbset.GetFieldValue("FilePath");
		//varOrder=Dbset.GetFieldValue("Order");
		//Dbset.GetFieldValue("Age",varage);//将数据库里的文件读出来
		SFileName=(LPCSTR)_bstr_t(varFileName);
		//Sage=(LPCSTR)varage.pbstrVal;//分别将数据库里读出来的文件转化为CString
        SFileStatus=(LPCSTR)_bstr_t(varFileStatus);
		SFilePath=(LPCSTR)_bstr_t(varFilePath);
       //计算需要多少个字节才能表示对应的多字节字符串
DWORD num=WideCharToMultiByte(CP_ACP,0,(LPCWSTR)(LPCSTR)SFilePath,-1,NULL,0,NULL,0);

//开辟空间
char *pChar=NULL;
pChar=(char*)malloc(num*sizeof(char));
if (pChar==NULL)
{
	free(pChar);
}
memset(pChar,0,num*sizeof(char));

//将宽字节字符串转换为多字节字符串
WideCharToMultiByte(CP_ACP,0,(LPCWSTR)(LPCSTR)SFilePath,-1,pChar,num,NULL,0);

		//SOrder=(LPCSTR)_bstr_t(varOrder);
		m_list.InsertItem(i,"");//向列表视图控件中新插入一行
		//m_list.SetItemText(i,0,SOrder);
		m_list.SetItemText(i,0,SFileName);//改变列表视图项或子项的文本
		m_list.SetItemText(i,1,SFileStatus);//改变列表视图项或子项的文本
		m_list.SetItemText(i,2,pChar);
		Dbset.MoveNext();//使记录集的下一条记录成为当前记录,否则就不能循环
			i++;
	}
	Dbset.Close();
	db.Close();
之所以要转换回来,是要转换回CString
worldy 2015-05-18
  • 打赏
  • 举报
回复
你应该是使用未指定的字符集或者多字节字符集编译的,返回的数据使用WidcharToMultiByte转换回ansi编码
worldy 2015-05-18
  • 打赏
  • 举报
回复
读回的数据,你再转回-bstr_t干吗? lz你不能贴你的大妈吗?干吗要贴图?
yfz503640916 2015-05-18
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
你应该是使用未指定的字符集或者多字节字符集编译的,返回的数据使用WidcharToMultiByte转换回ansi编码

按照你的方式改了,仍然只能读出一个“D”。我把存数据时的多字节都转换了,依然是这个问题

4,011

社区成员

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

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