Chào các bạn,
Hiện mình đang viết ứng dụng Windows bằng MFC trên VC 2008 và kết nối Database thông qua ADO sử dụng RecordSet.
Mình đang gặp lỗi hiển font Unicode thị khi kết nối database với file Excel, chỉ lỗi trên file Excel thôi còn khi kết nối file Access thì vẫn hiển thị bình thường.
Ví dụ như trong file Excel có trường là "Trần" thì trên ứng dụng khi kết nối là "Tr?n"
Trong hàm GetRecord() có nhiệm vụ lấy dữ liệu trong từng bản ghi của file Excel.
Mình DEBUG thì lỗi nó nằm ở hàm fieldInfo.vtValue = m_pRecordSet->Fields->GetItem(vtIndex)->GetValue();
Câu lệnh này có chức năng là từ con trỏ m_pRecordSet chứa bản ghi đang xét của database, lấy con trỏ Fields chứa thông tin về các cột trong database, lấy 1 cột cụ thể dựa vào thứ tự vtIndex và cuối cùng là lấy data trong database tại cột đã chọn GetValue().
Các bạn giúp mình xem mình đang sai ở phần nào với.
Code:
FieldInfoArray* CCESDatabaseObj::GetRecord()
{
if(m_pRecordSet)
{
int i,nCount;
_variant_t vtIndex;
FieldsPtr fldLoop;
FieldInfoArray *plstFieldInfo;
CESFieldInfo fieldInfo;
vtIndex.vt = VT_I4;
plstFieldInfo = NULL;
try
{
fldLoop = m_pRecordSet->GetFields();
nCount = fldLoop->GetCount();
if(nCount<=0)
{
m_strError = _T("Field not found");
return NULL;
}
plstFieldInfo = new FieldInfoArray();
for(i=0;i<nCount;i++)
{
vtIndex.lVal=i;
// Phan nay hien thi ten cot trong database dung Unicode
fieldInfo.strFieldName = (TCHAR*)(fldLoop->GetItem(vtIndex)->GetName());
fieldInfo.dataType = fldLoop->GetItem(vtIndex)->Type;
fieldInfo.lDataSize = fldLoop->GetItem(vtIndex)->DefinedSize;
if(fldLoop->GetItem(vtIndex)->GetAttributes()==16) //If Autonumber
{
fieldInfo.bAutoNumber = true;
}
else
{
fieldInfo.bAutoNumber = false;
}
if(fldLoop->GetItem(vtIndex)->GetAttributes() & adFldIsNullable) //If NULL Enable
{
fieldInfo.bAllowNull = true;
}
else
{
fieldInfo.bAllowNull = false;
}
// Loi Unicode khi lay du lieu
//m_pRecordSet->get_Collect((_variant_t)(_bstr_t)fieldInfo.strFieldName,&fieldInfo.vtValue);
fieldInfo.vtValue = (CString)m_pRecordSet->Fields->GetItem(vtIndex)->GetValue();