我用ODBC方法处理EXCEL表,但提示
数据库错误:microsoft Jet 数据库引擎找不到对象
但我的数据库确实存在
请各位帮忙!代码如下:
void CPA_return_dataDlg::OnOk() 
{
CStdioFile ReturnFile;
CString m_Return_File_Name;  //返传文件名
CString In_Record=_T("");
CString m_Source_File_Name;  //Execl格式的文件名 CString m_Flag;               //处理标志
CString m_Account;            //账号
CString m_Amount;            //应发的金额
CString m_Amount_Real_Deal;   //实际发的金额
 //   CDatabase database;
   
CDatabase database;
    CString sSql;
    CString sItem1, sItem2;
    CString sDriver;
    CString sDsn;
    CString sFile; 
// TODO: Add your control notification handler code here
    //添加具体处理代码
    GetDlgItemText(IDC_RETURN_FILENAME,m_Return_File_Name);
GetDlgItemText(IDC_SOURCE_FILENAME,m_Source_File_Name);
if (ReturnFile.Open(m_Return_File_Name,CFile::modeRead) == FALSE )
{
MessageBox("打开文件错误",NULL,NULL);
return;
}
     BOOL  bEnd=ReturnFile.ReadString(In_Record);
if(!bEnd)
{
MessageBox("源文件为空:请检查文件!",NULL,MB_ICONSTOP);
return ;
}
sFile = m_Source_File_Name; // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)" 
    sDriver = GetExcelDriver();
    if (sDriver.IsEmpty())
    {
        // 没有发现Excel驱动
        AfxMessageBox("没有安装Excel驱动!");
        return;
    }
    
    // 创建进行存取的字符串
    sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
  //sFile = "bank030109.xls";
 AfxMessageBox(sDsn);//end 创建数据库连接 while (bEnd )
{         m_Flag=In_Record.Mid(1,3);
 m_Account=In_Record.Mid(16,19);          
       m_Amount=In_Record.Mid(42,17);             
     m_Amount_Real_Deal=In_Record.Mid(59,17);   
     //    AfxMessageBox("没有安装Excel驱动!");
         GetDlgItem(IDC_DISP)->SetWindowText(m_Flag+m_Account+m_Amount);
         UpdateData(TRUE);
         CString t_m_Account ;  for( int i=sFile.GetLength();i>=0; i--)
 if(sFile.GetAt(i)=='.')
 {
sFile.SetAt(i,'\0');
break;
 }
   TRY
    {
        // 打开数据库(既Excel文件)
        database.Open(NULL, false, false, sDsn);
        
        CRecordset recset(&database);
 
        // 设置读取的查询语句.
        sSql = "SELECT Name, Age "
   "FROM  "+sFile ;
AfxMessageBox(sSql);
    
        // 执行查询语句
      recset.Open(CRecordset::snapshot    , sSql, CRecordset::none);
 
        // 获取查询结果
        while (!recset.IsEOF())
        {
            //读取Excel内部数值
            recset.GetFieldValue("Name ", sItem1);
            recset.GetFieldValue("Age", sItem2);
 
            // 移到下一行
            recset.MoveNext();
        }
       // 关闭数据库
        database.Close();
                             
    }
    CATCH(CDBException, e)
    {
        // 数据库操作产生异常时...
        AfxMessageBox("数据库错误: " + e->m_strError);
    }
    END_CATCH;   
    bEnd=ReturnFile.ReadString(In_Record);
}
CDialog::OnOK();
}

解决方案 »

  1.   

    sSql = "SELECT Name, Age FROM  "+sFile ;
    sFile是文件名(数据库名)
    这里应该是表名,比如Sheet1等等...
      

  2.   

    to: zhang1000(多一个零)
    我把文件名称改为数据表名(sheet)还是提示同样的信息。
      

  3.   

    再检查一下吧....
    通常如果你没有改过表名的话应该是Sheet1,Sheet2,Sheet3等等
    "sheet"对吗?
    或者DEBUG一下看看到哪行出错?
    如果database.Open(NULL, false, false, sDsn);能过,连接就没有问题,
    如果表名有问题recset.Open(CRecordset::snapshot    , sSql, CRecordset::none);就出错.
    另外recset.GetFieldValue("Name ", sItem1);
    中的"Name "好象有空格,是否可以我没有试过...
    其他地方好象没有什么问题...GOOD LUCK...
      

  4.   

    谢谢!zhang1000
    表名我改为aaaa,但确提示同样的错误
    另外我的文件名和表名(Sheet)不同没有关系吧?
      

  5.   

    是这样写吗?        sSql = "SELECT 银行帐号, 客户姓名 "
    "FROM  Sheet1" ;
      

  6.   

    excel里的表默认为系统表,直接是访问不到的,比如 select * from sheet1
    应该改为 select * from [$sheet1]
      

  7.   

    不好意思,忘记说明一下,访问EXCEL的表时表名应该用[表名$].
    sSql = "Select * from [Sheet1$]";
    另外recset.GetFieldValue("Name ", sItem1);
    中的"Name "好象不能有空格...
      

  8.   

    我怎么还是通不过呀?!仍然提示
    数据库错误:microsoft Jet 数据库引擎找不到对象$Sheet1(这个名称我核实
    应该没有问题),请确定对象是否存在,并正确地写出它的名称和路径
    急!!!
      

  9.   

    请问zhang1000(多一个零),那里有相关的资料