关于以ODBC和ADO方式访问excel数据库总结

温馨提醒,看帖子前请复习下连接数据方式有哪几种,以及各有什么优缺点,然后再来看本贴。 

首先阐述一个小问题,如何用excel建立一张表呢?

1.excel 2003的情况,假如excel中第一行是字段名,第二行以后是数据行,则选择多行(包括第一行),然后菜单中选择“插入”->名称->自定义名称。其中这个名称就是表名,用在select * from 表名语句中。

2.excel 2007的情况,假如excel中第一行是字段名,第二行以后是数据行,则选择多行(包括第一行),然后菜单中选择“公式”->自定义名称。其中这个名称就是表名,用在select * from 表名语句中。

然后来写ODBC和ADO方式来访问excel

ODBC:代码如下

void CDirCheckDemoDlg::OnReadExcel(CString csFile)
{
	CDatabase database;
    CString sSql;
    CString sItem[11];
    CString sDriver;
    CString sDsn;
    CString sFile,sPath;	
    sFile = csFile ; 			// 将被读取的Excel文件名

	//动态注册数据源
	
	
     if(!SQLConfigDataSource(0,ODBC_ADD_DSN,"Microsoft Excel Driver (*.xls)\0","DSN=mydb\0Description=MouseDataBase\0DBQ=sFile\0\0"))
    {
	AfxMessageBox("添加DSN失败...");
	return;
    }


    // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)" 
    sDriver = GetExcelDriver();
    if (sDriver.IsEmpty())
    {
        // 没有发现Excel驱动
        AfxMessageBox("没有安装Excel驱动!");
        return;
    }
    
    // 创建进行存取的连接字符串
    sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
	
    TRY
    {
        // 建立与ODBC数据源的连接
        database.Open(NULL, false, false, sDsn);	
        // 设置读取的查询语句
        sSql = "SELECT *"//sSql = "SELECT Name, Age "      
			"FROM ExcelDemo " ;                
		"ORDER BY Name ";
		CRecordset recset(&database);
        // 执行查询语句
        recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
		
        // 获取查询结果
        while (!recset.IsEOF())
        {
            //读取Excel内部数值
            recset.GetFieldValue("FileNr 1", sItem[0]);
            recset.GetFieldValue("ReportFlag", sItem[1]);
			recset.GetFieldValue("Date",sItem[2]);
			recset.GetFieldValue("Time",sItem[3]);
			recset.GetFieldValue("Output volt",sItem[4]);
			recset.GetFieldValue("Output cur",sItem[5]);
			recset.GetFieldValue("Reg volt",sItem[6]);
			recset.GetFieldValue("Reg cur",sItem[7]);
			recset.GetFieldValue("ExcVolt",sItem[8]);
			recset.GetFieldValue(" Meas 1",sItem[9]);
			recset.GetFieldValue(" Meas 2",sItem[10]);			
			//显示记取的内容
			for (int i = 10;i >= 0;i--)
			{
				m_List.AddString( sItem[i]);//m_List为CListBox控件名
			}
			
			
			/*
			CString string;
			string.Format("%s %s",sItem1,sItem2);
			AfxMessageBox(string);*/
            // 移到下一行
            recset.MoveNext();
        }
		
        // 关闭数据库
        database.Close();
		
    }
    CATCH(CDBException, e)
    {
        // 数据库操作产生异常时
        AfxMessageBox("数据库错误: " + e->m_strError);
    }
    END_CATCH;
}

以上是ODBC访问excel 2003代码,注意点:连接字符串,还有要运行程序才知道查询得到的数据顺序是随机的,不是第一句程序访问的数据显示一定是在第一句数据的。

ODBC连接excel 2007代码,请修改相应连接字符串,字符串网上好像没找到,自己找吧。

ADO访问excel 代码:

void CAdoDlg::OnBtnQuery() 
{

    CoInitialize(NULL);
    _ConnectionPtr pConn(_uuidof(Connection));
    _RecordsetPtr pRst(_uuidof(Recordset));
 
   // pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=f://study/win32_app/Ado/Demo.xls;Extended Properties=Excel 8.0;Persist Security  Info=False";//访问excel 2003字符串
 pConn->ConnectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=f://study/win32_app/Ado/1.xlsx;Extended Properties='Excel 12.0 Xml;HDR=YES'";//访问excel 2007字符串
    pConn->Open("","","",adModeUnknown);
 
// pRst=pConn->Execute("select * from ExcelDemo",NULL,adCmdText);
    pRst=pConn->Execute("select * from File",NULL,adCmdText);
   while (!pRst->rsEOF)
   {
           ((CListBox *)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("FileNr 1"));
         ((CListBox *)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("ReportFlag"));
         ((CListBox *)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("Date"));
         ((CListBox *)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("Time"));
        ((CListBox *)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("Output volt"));
        ((CListBox *)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("Output cur"));
        ((CListBox *)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("Reg volt"));
        ((CListBox *)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("Reg cur"));
        ((CListBox *)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect("ExcVolt"));
        ((CListBox *)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect(" Meas 1"));
        ((CListBox *)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect(" Meas 2"));
        pRst->MoveNext();
   }

      pRst->Close();
     pConn->Close();
     pRst.Release();
    pConn.Release();
    CoUninitialize();
}



以上,想交流的请留言,还有哪位同志知道ODBC 连接excel 2007字符串的也请回答下?

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值