BOOL JDatabase::OpenDB(LPCTSTR localset,LPCTSTR DBclass){
_bstr_t strConnect;
try{
#if    ACCESS && Jtoupper(DBclass)
conn->Open("Provider = Microsoft.Jet.OLEDB.4.0;DataSource = localset ","","",adModeUnknown);
#else
#if (SQL && Jtouper(DBclass))
strConnect = " Provider=SQLOLEDB; Server=billgates;Database=HrMan; uid=sa; pwd=sa;" ;
conn->Open(strConnect,"","",adModeUnknown);
#endif
#endif
}
catch(_com_error e ){
error("OpenDB function");
        
}
return TRUE;
}
大家看看这个函数设计的有没有什么问题如果有请问需要怎么改

解决方案 »

  1.   

    1 条件编译语句不会存在于运行代码中,对预编译宏(ACCESS/SQL)的判断不能和对参数的判断放一起.
    2 try...catch中,捕获异常并处理后,返回FALSE.
    3 条件编译应该是这样
      #ifdef ACCESS
      或
      #if defined ACCESS
      在所有编译条件都不满足时,给个错误提示
      #ifdef ACCESS
      #else
      #ifdef SQL
      #else
    未指定数据库类型
      #endif
      #endif
      

  2.   

    用API函数CharUpperBuff可以直接代替你的Jtoupper函数,而且支持UniCode。

    #ifdef
    #else
    #endif
    来控制预编译变量。或者直接用参数控制。
    BOOL JDatabase::OpenDB(LPCTSTR localset,LPCTSTR DBclass , bool bAccess)
    {
       _bstr_t strConnect;
       try{
           CharUpperBuff(DBclass ,lstrlen(DBclass));
           if( bAccess )
           {
    conn->Open("Provider = Microsoft.Jet.OLEDB.4.0;DataSource = localset ","","",adModeUnknown);
            }
           else
            {
    strConnect = " Provider=SQLOLEDB;Server=billgates;Database=HrMan; uid=sa; pwd=sa;" ;
    conn->Open(strConnect,"","",adModeUnknown);

    }
    }
    catch(_com_error e ){
    error("OpenDB function");
            
    }
    return TRUE;
    }
    在函数里怎么没看到DBclass 的使用。
    我不知道你设计这个函数的意图是什么?
      

  3.   

    第一个问题
    char* u = "This is com";
    *(u+i)  = toupper(*(u+i));
    可以从u+i地址中读取数据为什么不能写入呢!
    还有条件编译在什么情况下使用!以及使用的条件是什么
      

  4.   

    catch(_com_error e ){
    error("OpenDB function");
            
    }
    改为:
    catch(_com_error e ){
    error("OpenDB function");
                      return FALSE;
            
    }