MFC中利用ODBC保存数据为Excel的问题的 解决方法

来源:互联网 发布:电视怎么调成网络电视 编辑:程序博客网 时间:2024/04/28 01:30

 CDatabase database;
    CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
    CString sSql,sExcelFile;
    //弹出对话框选择路径
    CFileDialog fileDlg (FALSE, "Path", filename,OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, "*.xls");
  if( fileDlg.DoModal()==IDOK)
    {
    sExcelFile = fileDlg.GetPathName();    // 要建立的Excel文件
        CFileFind finder;
        BOOL bWorking = finder.FindFile(sExcelFile);//寻找文件
  
  if (bWorking)//如果已经存在文件,则删除
        {
            CFile::Remove((LPCTSTR)sExcelFile);
        }
 
     }
     else return;
 
  // 创建进行存取的字符串
       sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/"%s/";DBQ=%s",  sDriver, sExcelFile, sExcelFile);
      // 创建数据库 (既Excel表格文件)
       if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
       {
     CHeaderCtrl* pHeader = resultlist.GetHeaderCtrl();
           //获得行,列的个数
           int nColCount = pHeader->GetItemCount();
           int nLineCount = resultlist.GetItemCount();
           int ColOrderArray[100];
           CString ca[100];
           resultlist.GetColumnOrderArray(ColOrderArray, nColCount);
     //检索各列的信息,确定列标题的内容
          for(int i =0 ; i< nColCount; i++)
          {
    
     LVCOLUMN lvc;
              char text[100];
              lvc.mask = LVCF_TEXT|LVCF_SUBITEM;
              lvc.pszText = text;
              lvc.cchTextMax = 100;
              resultlist.GetColumn(ColOrderArray[i], &lvc);
              ca[i] = lvc.pszText;      
          }
          // 创建表结构
          CString tempsql="(";
          for(i =0 ; i< nColCount-1; i++)
          {
              tempsql+=ca[i];
              tempsql+=" TEXT,";
     
           }
         tempsql+=ca[nColCount-1];
          tempsql+=" TEXT)";
          sSql = "CREATE TABLE Sheet1 ";
          sSql+=tempsql;
          database.ExecuteSQL(sSql);
   
    //插入数据
          int item_count=resultlist.GetItemCount();
          tempsql="(";
          for(i =0 ; i< nColCount-1; i++)
          {
              tempsql+=ca[i];
              tempsql+=" ,";
     
          }
          tempsql+=ca[nColCount-1];
          tempsql+=")";
   
    for(int itemnum=0;itemnum<item_count;itemnum++){    
          sSql="";
          sSql ="INSERT INTO Sheet1 ";
          sSql+=tempsql;
          sSql+="VALUES ('";
          for(i =0 ; i< nColCount-1; i++)
          {
              sSql+=resultlist.GetItemText(itemnum, i);
              sSql+="','";
     
          }
          sSql+=resultlist.GetItemText(itemnum, nColCount-1);
          sSql+="')";
          database.ExecuteSQL(sSql);
      }
   }      
  
   // 关闭数据库
   database.Close();

 AfxMessageBox("Excel文件写入成功!");

----------------------------

程序在前面黑体字的地方就出错了!报出的错误是:(一个对话框!)

--------------------------------------------------------------------

不能更新。数据库和对象为只读。

非法的连接串属性FIRSTROWHASNAMES

非法的连接串属性CREATE_DB

非法的连接串属性FIRSTROWHASNAMES

非法的连接串属性CREATE_DB

非法的连接串属性FIRSTROWHASNAMES

非法的连接串属性CREATE_DB

非法的连接串属性FIRSTROWHASNAMES

非法的连接串属性CREATE_DB

非法的连接串属性FIRSTROWHASNAMES

非法的连接串属性CREATE_DB

非法的连接串属性FIRSTROWHASNAMES

非法的连接串属性CREATE_DB

 驱动程序的SqlSetConnectAttr失败

---------------------------------------------------------------------

我的csdn上看到别人也是这么用的,他们怎么没有出现这个问题啊!?我是MFC新手,希望各位大侠告知啊!!有点急啊!


解决方法,微软最新的补丁程序 KB4041691 卸载掉就可以了。控制面板-程序-卸载程序-查看已安装的更新-卸载掉 KB4041691补丁就可以了,还有另外两个补丁KB4040678,KB4041681