求助关于数据库的问题

maosher 2010-08-10 05:15:26
现在有一个思路上的问题

在自己封装数据库连接的时候


class CADOConnection
{
public:
CADOConnection();
BOOL OpenConnection(CString strDataSource, CString strUser, CString strPassword );
BOOL Close();
bool Execute(LPCTSTR lpcsrCommand);
//...
public:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;

}




在使用时 应用程序里

class CBaseNetApp : public CWinApp
{
public:
//...
protected:
CADOConnection m_Connection;

}

BOOL OpenConnection(CString strDataSource, CString strUser, CString strPassword );
里执行的是
m_pConnection->Open(_bstr_t(m_strConnect), "", "", adModeUnknown)。。。

现在我的疑问时,在应用时,需要在每次执行查询时都要打开连接,然后执行完关闭么?
我看了一些例子,全是在应用程序 InitInstance()时个执行连接,ExitInstance()时m_pConnection->Close();

这样如果在程序运行当中数据库程序发生异常呢?另外当多线程执行查询等操作时又怎么处理?队列?
...全文
123 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
maosher 2010-08-11
  • 打赏
  • 举报
回复

typedef /* [wire_marshal] */ struct tagVARIANT VARIANT;

struct tagVARIANT
{
union
{
struct __tagVARIANT
{
VARTYPE vt;
WORD wReserved1;
WORD wReserved2;
WORD wReserved3;
union
{
LONGLONG llVal;
LONG lVal;
BYTE bVal;
SHORT iVal;
FLOAT fltVal;
DOUBLE dblVal;
VARIANT_BOOL boolVal;
_VARIANT_BOOL bool;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
IUnknown *punkVal;
IDispatch *pdispVal;
SAFEARRAY *parray;
BYTE *pbVal;
SHORT *piVal;
LONG *plVal;
LONGLONG *pllVal;
FLOAT *pfltVal;
DOUBLE *pdblVal;
VARIANT_BOOL *pboolVal;
_VARIANT_BOOL *pbool;
SCODE *pscode;
CY *pcyVal;
DATE *pdate;
BSTR *pbstrVal;
IUnknown **ppunkVal;
IDispatch **ppdispVal;
SAFEARRAY **pparray;
VARIANT *pvarVal;
PVOID byref;
CHAR cVal;
USHORT uiVal;
ULONG ulVal;
ULONGLONG ullVal;
INT intVal;
UINT uintVal;
DECIMAL *pdecVal;
CHAR *pcVal;
USHORT *puiVal;
ULONG *pulVal;
ULONGLONG *pullVal;
INT *pintVal;
UINT *puintVal;
struct __tagBRECORD
{
PVOID pvRecord;
IRecordInfo *pRecInfo;
} __VARIANT_NAME_4;
} __VARIANT_NAME_3;
} __VARIANT_NAME_2;
DECIMAL decVal;
} __VARIANT_NAME_1;
} ;



具体执行不同的查询,对VARIANT * RecordsAffected, 取的有效果的部分不一样吧
sniperhuangwei 2010-08-11
  • 打赏
  • 举报
回复
受影响的记录数,例如update语句更新了几条记录
maosher 2010-08-11
  • 打赏
  • 举报
回复
_RecordsetPtr Connection15::Execute ( _bstr_t CommandText,
VARIANT *
RecordsAffected,
long Options )

其中CommandText是命令字串,通常是SQL命令。
参数RecordsAffected是操作完成后所影响的行数,
参数Options表示CommandText中内容的类型,Options可以取如下值之一:
adCmdText:表明CommandText是文本命令
adCmdTable:表明CommandText是一个表名
adCmdProc:表明CommandText是一个存储过程
adCmdUnknown:未知

例子:
_variant_t RecordsAffected;
m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);


求第二个参数 _variant_t RecordsAffected; 的用法
sniperhuangwei 2010-08-10
  • 打赏
  • 举报
回复
而_CommandPtr甚至可以不需要,直接在execute传1个sql命令进去就行了
sniperhuangwei 2010-08-10
  • 打赏
  • 举报
回复
这不是破坏封装性的问题,recordset和connection本来就不存在一一对应的关系。
recordset只是作为query的结果。
maosher 2010-08-10
  • 打赏
  • 举报
回复
确实,我晚上考虑,
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;

设计为连接管理类的成员变量都是不对的。



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

这二个放在连接管理类里不大好,用的时候直接用它们吧,破坏了封装性
maosher 2010-08-10
  • 打赏
  • 举报
回复
还是自己先封装写一下,要不然也搞不清楚。有现成的地址么,贴一个我看看
sniperhuangwei 2010-08-10
  • 打赏
  • 举报
回复
以做项目为目的优先考虑现成可用的,以学习为目的自己封装很有必要。
dahai9825 2010-08-10
  • 打赏
  • 举报
回复
还自己封装? 推荐SQLAPI
senlinzhiwang 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 maosher 的回复:]
如果在多线程,项目里的查询返回一般是怎么保存的呢?
单线的程序现在每查询后,m_pRecordset->open(SQL sql...),然后从m_pRecordset里取结果
[/Quote]

测试一下看看出来什么结果,然后再分析。
sniperhuangwei 2010-08-10
  • 打赏
  • 举报
回复
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;

设计为连接管理类的成员变量都是不对的。
sniperhuangwei 2010-08-10
  • 打赏
  • 举报
回复
execute直接返回recordset就好了。
maosher 2010-08-10
  • 打赏
  • 举报
回复
如果在多线程,项目里的查询返回一般是怎么保存的呢?
单线的程序现在每查询后,m_pRecordset->open(SQL sql...),然后从m_pRecordset里取结果
zwicker 2010-08-10
  • 打赏
  • 举报
回复
当然是应用程序启动的时候开启连接,程序退出再关闭连接

像你这样每次查询连接再关闭,不是很浪费时间吗,如果是服务器程序,怎么可以

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧