我想作一个这样的封装类.
连接为内部静态的对象 要初始化一次就可以了.
但是是记录集是内部变量.每一个新的类实例就会产生一个.
封装类里不有一个CString的成员变量记录每一个SQL的COM出错信息. static long g_irefnum;
static CCriticalSectionWrapper g_cwAdosync;
static COptions *m_pOptions;
static CADOConnection g_sAdoConn;
CString m_sLastErr;
CADODataset m_dsResult;
BOOL bInit;初始化:  Init
EnterCritSection(g_cwAdosync);
// ASSERT(FALSE);
// ASSERT(m_pOptions!=NULL);
if(m_pOptions==NULL){
m_sLastErr=_T("m_pOptions is not Set!");
return false;
}
if(g_sAdoConn.Init() && g_sAdoConn.IsOpen() && !needreset){
m_dsResult.SetConnection(&g_sAdoConn);
LeaveCritSection(g_cwAdosync);
return true;
} int m_iDBtype=m_pOptions->GetOptionVal(OPTION_DATABASE_TYPE);
CString m_sIp = m_pOptions->GetOption(OPTION_DATABASE_HOST);
int m_iPort = m_pOptions->GetOptionVal(OPTION_DATABASE_PORT);
CString m_sUserName = m_pOptions->GetOption(OPTION_DATABASE_USERNAME);
CString m_sPassWord = m_pOptions->GetOption(OPTION_DATABASE_PASSWORD);
if(!g_sAdoConn.Init()){
m_sLastErr=g_sAdoConn.GetLastErr();
LeaveCritSection(g_cwAdosync);
return false;
};
CString m_sConn="driver={sql server};server="+m_sIp + ";DataBase="+DB_NAME+";uid="+m_sUserName+";pwd="+m_sPassWord+";";
if(!g_sAdoConn.Open(m_sConn)){
m_sLastErr=g_sAdoConn.GetLastErr();
LeaveCritSection(g_cwAdosync);
return false;
}
m_dsResult.SetConnection(&g_sAdoConn);
LeaveCritSection(g_cwAdosync);
return true;我发现在客户使用时不能析构对象
如果是在类内声明为成员.则在类析构时出错.如果是在堆中构造.则类析构时不能delete掉不然也会出错.但我使用其它相关结构的类(也包含静态成员,用了STL,可能是没有用ADO或者是COM吧.)可以这样做.还有一些情况,还需要证实.假如a是封装类.
b,c是客户类.
那么如果b里面初始化了.则b以后的实例都可以不用初始化.
但是如果现在产生一个新c的实例..则C里面的a里的ConnectionPtr已经产生实例,但是没有连接到数据库.不知道为什么?好像引用的不是同一个静态变量.我想这应该不可能呀.
本来自己封装了一个,但是困难多多.由于急于使用.请各位如果有类似的范例,或应用情况也请告诉我.多多感谢!

解决方案 »

  1.   

    我想达到的就是.
    在多线程环境下.这个类只有在第一个构造的时候初始化连接.以后的每一次初始化只初始化dataset然后都引用同一个数据库连接.
      

  2.   

    初始化COM是线程相关的,每个线程都要做。
    对与连接,可以用单态模式来实现,这样容易操作。即使不是,也是在主线程里面来建立连接,所以EnterCritSection什么的没有必要。
      

  3.   

    楼上说的有道理,就是我没有在多线程正面写过ADO.所以不懂.可以请大家讲解得深入一点吗?
      

  4.   

    连接在构造中初始化一次,或共享连接
    com初始化,每个线程都需要