我想作一个这样的封装类.
连接为内部静态的对象 要初始化一次就可以了.
但是是记录集是内部变量.每一个新的类实例就会产生一个.
封装类里不有一个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已经产生实例,但是没有连接到数据库.不知道为什么?好像引用的不是同一个静态变量.我想这应该不可能呀.
本来自己封装了一个,但是困难多多.由于急于使用.请各位如果有类似的范例,或应用情况也请告诉我.多多感谢!
连接为内部静态的对象 要初始化一次就可以了.
但是是记录集是内部变量.每一个新的类实例就会产生一个.
封装类里不有一个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已经产生实例,但是没有连接到数据库.不知道为什么?好像引用的不是同一个静态变量.我想这应该不可能呀.
本来自己封装了一个,但是困难多多.由于急于使用.请各位如果有类似的范例,或应用情况也请告诉我.多多感谢!
解决方案 »
- 为什么我重复调用一个按钮函数 对话框窗口会出现 (没有响应)
- SafeArrayAccessData如何操作二维数组
- 如何获得当前具有输入焦点的控件的句柄(不一定为本程序,可能是任意一程序)?
- flash界面
- 有些高兴,因为笔试有戏,明天去面试, 不过想大家给我些意见吧.
- richtx32.ocx控件问题
- 很傻的问题:如何重载二元减?耐心等待中...
- 高难问题,请提供思路!分可以多多!
- 我的code不行,然而我也有点用处,对于买书,我还是有一套的.以下几本书,我想分别介绍一下.
- 请问哪个是对话框显示完成的消息?
- 从某种影像数据来创建位图而不正常,求救!!!
- ADO连接数据,如何获得数据库里的表名、表数量?
在多线程环境下.这个类只有在第一个构造的时候初始化连接.以后的每一次初始化只初始化dataset然后都引用同一个数据库连接.
对与连接,可以用单态模式来实现,这样容易操作。即使不是,也是在主线程里面来建立连接,所以EnterCritSection什么的没有必要。
com初始化,每个线程都需要