我要将文件保存成txt,xls和所有文件3种形式设成if选择语句
能存txt但是存不了xls,程序编译没有错误,运行后保存选择文件种类保存,弹出对话框说:
不能使用‘(未知的)’;文件已在使用中。
非法的连接串属性FIRSTOWHASNAMES
非法的连接串属性CREATE_DB


驱动程序的SQLSetConnectAttr失败
单步调试运行到下面这步就不行啦
if(database.OpenEx(strsql,CDatabase::noOdbcDialog))
代码如下:void CShowDlg::OnSavelistButton() 
 {
  // TODO: Add your control notification handler code here
// CFileDialog fileDlg(FALSE,NULL,"",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,szFilters);
  CFileDialog fileDlg(FALSE);
fileDlg.m_ofn.lpstrTitle="成绩列表保存";
//fileDlg.m_ofn.Flags=OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
  fileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0XLS Files(*.xls)\0*.xls\0All Files(*.*)\0*.*\0\0";
  fileDlg.m_ofn.lpstrDefExt="txt";
CString temp0,temp1,temp2,temp3,temp4,temp5,temp6,m_filename; if(IDOK==fileDlg.DoModal())
  {
CFile file(fileDlg.GetFileName(),CFile::modeCreate | CFile::modeWrite); DWORD filter_num=fileDlg.m_ofn.nFilterIndex;//确定选择第几种文件类型
CString k;
k.Format("%ld",filter_num);
MessageBox(k); if(2==filter_num)
{
m_filename=fileDlg.GetPathName();
CDatabase database;
CString exceldrive="MICROSOFT EXCEL DRIVER (*.XLS)";
//CString excelfile="d:\\test.xls";    //注意双线
CString strsql;
strsql.Format("DRIVER={%s};DSN="";FIRSTOWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",exceldrive,m_filename,m_filename); if(database.OpenEx(strsql,CDatabase::noOdbcDialog))
//cdatabase::noodbcdialog 无论提供的连接信息是否足够,都不显示 odbc 连接对话框。 
//cdatabase::forceodbcdialog 总是显示 odbc 连接对话框。
{
strsql="CREATE TABLE temptable(序号 TEXT,学号 TEXT,姓名 TEXT,语文 TEXT,数学 TEXT,英语 TEXT,总成绩 TEXT)";
// TRY
// {
database.ExecuteSQL(strsql);
// }
/* CATCH(CDBException, e)
{

CString strMsg;
strMsg.LoadString(0);
strMsg+=strsql+"\n请重命名";
}
END_CATCH

*/
for(int i=0;i<countAll;i++)
    {
  
    temp0=m_mylist.GetItemText( i, 0 );
  temp1=m_mylist.GetItemText( i, 1 );
  temp2=m_mylist.GetItemText( i, 2 );
  temp3=m_mylist.GetItemText( i, 3 );
  temp4=m_mylist.GetItemText( i, 4 );
  temp5=m_mylist.GetItemText( i, 5 );
  temp6=m_mylist.GetItemText( i, 6 );
  strsql.Format("insert into temptable(序号,学号,姓名,语文,数学,英语,总成绩)values('%s','%s','%s','%s','%s','%s','%s')",temp0,temp1,temp2,temp3,temp4,temp5,temp6);  //sql语句一定是
  database.ExecuteSQL(strsql);

}
}
database.Close(); }

else
{
CFile file(fileDlg.GetFileName(),CFile::modeCreate | CFile::modeWrite);
    
  file.Write("序号\学号\t姓名\t语文\t数学\t英语\t总成绩\n",strlen("学号\t姓名\t语文\t数学\t英语\t总成绩"));     
    for(int i=0;i<countAll;i++)
    {
  
    temp0=m_mylist.GetItemText( i, 0 );
  temp1=m_mylist.GetItemText( i, 1 );
  temp2=m_mylist.GetItemText( i, 2 );
  temp3=m_mylist.GetItemText( i, 3 );
  temp4=m_mylist.GetItemText( i, 4 );
  temp5=m_mylist.GetItemText( i, 5 );
  temp6=m_mylist.GetItemText( i, 6 );
  file.Write(temp0+'\t'+temp1+'\t'+temp2+'\t'+temp3+'\t'+temp4+'\t'+temp5+'\t'+temp6+'\t',temp0.GetLength()+temp1.GetLength()+temp2.GetLength()+temp3.GetLength()+temp4.GetLength()+temp5.GetLength()+temp6.GetLength()+7);
 
    }  
    
  file.Close();
}
    

    
}}
是说因为if语句的分割么?开始的时候本来想将中间for()重复的代码合并,就把程序拆成了好几段,用switch控制,提示说case分割了××××不能运行现在合并了还是不行

解决方案 »

  1.   

    你代码里面有这么几行:
    if(IDOK==fileDlg.DoModal())
         {
            CFile file(fileDlg.GetFileName(),CFile::modeCreate | CFile::modeWrite);就是说,你已经打开了文件了,然后数据库系统再去打开的话,会不会出错呢?
      

  2.   

    嗯。删了数据库的那块的就好了。
    那为什么写txt文件就要打开?
    是说数据库写入自己还要打开该文件么?
    数据库保存的话具体流程是什么样子的啊?还有为什么这个xls不能覆盖已经存在的同名文件呢?
    它说表头已经存在,要用什么方法覆盖啊?
    就是下面这块
    if(2==filter_num)
            {
                            m_filename=fileDlg.GetPathName();
                CDatabase database;
                CString exceldrive="MICROSOFT EXCEL DRIVER (*.XLS)";
                //CString excelfile="d:\\test.xls";    //注意双线
                CString strsql;
                strsql.Format("DRIVER={%s};DSN="";FIRSTOWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",exceldrive,m_filename,m_filename);            if(database.OpenEx(strsql,CDatabase::noOdbcDialog))
                //cdatabase::noodbcdialog 无论提供的连接信息是否足够,都不显示 odbc 连接对话框。 
                //cdatabase::forceodbcdialog 总是显示 odbc 连接对话框。
                {
                    strsql="CREATE TABLE temptable(序号 TEXT,学号 TEXT,姓名 TEXT,语文 TEXT,数学 TEXT,英语 TEXT,总成绩 TEXT)";
                //    TRY
                //    {
                        database.ExecuteSQL(strsql);
                //    }
                /*    CATCH(CDBException, e)
                    {
                    
                        CString strMsg;
                        strMsg.LoadString(0);
                        strMsg+=strsql+"\n请重命名";
                    }
                    END_CATCH
                
            */
                    for(int i=0;i<countAll;i++)
                   {
                      
                       temp0=m_mylist.GetItemText( i, 0 );
                      temp1=m_mylist.GetItemText( i, 1 );
                      temp2=m_mylist.GetItemText( i, 2 );
                      temp3=m_mylist.GetItemText( i, 3 );
                      temp4=m_mylist.GetItemText( i, 4 );
                      temp5=m_mylist.GetItemText( i, 5 );
                      temp6=m_mylist.GetItemText( i, 6 );
                      strsql.Format("insert into temptable(序号,学号,姓名,语文,数学,英语,总成绩)values('%s','%s','%s','%s','%s','%s','%s')",temp0,temp1,temp2,temp3,temp4,temp5,temp6);  //sql语句一定是
                      database.ExecuteSQL(strsql);
                    
                    }
                }
                database.Close();        }要是没有方法的话我是只能先删除再创建么?可我找不到删除的函数。要是listctrl类deletall就什么都没了