如何编写这样一个函数,急啊。
假如有一SQL数据库test,一用户表user.
编写这样一个函数,功能是
1.连接数据库(使用Login中成功登陆后的全局连接变量)
2.用一个简单的SQL语句“访问(查询、更新或者插入)”用户表。
Login为一登录函数,返回一全局链接变量。
[解决办法]
哈哈 我看不应该写一个函数 根据你的需求大概要写4个functions吧
[解决办法]
.H 文件
class CMyDataBase
{
public:
int GetRecordCount(int& nCount);
bool ExecuteSQL(CString& strSQL);
void InitDBParam(CString sHost, CString sDBName, CString sUID, CString sPWD);
void CloseDB();
bool OpenDB();
bool IsConnectedValid();
CMyDataBase();
virtual ~CMyDataBase();
bool GetMTmsg(CMTMsg& Mtmsg);
bool SetMtmsgFlag(int iId, int iStatus);
bool MoveMtmsgToBak(int iId);
private:
void dmpCOMerr(_com_error &e, int line, char *file, bool traceOnly);
bool m_bConn;
void TrimStr(CString &sStr);
// 数据库参数
CString m_sDBHost; //数据库服务器名
CString m_sDBName; //数据库名
CString m_sUID; //数据库用户名
CString m_sPWD; //数据库密码
CString m_sConn;
_ConnectionPtrm_pConn;
};
cpp文件
#include "stdafx.h "
#include "MyDataBase.h "
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/*===========================================================================
*常用的宏
===========================================================================*/
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
//设置存储过程参数
#define PutPARA(pCom, name, value) (pCom)-> Parameters-> GetItem(_variant_t(name))-> PutValue(value)
//取得存储过程参数
#define GetPARA(pCom, name) (pCom)-> Parameters-> GetItem(_variant_t(name))-> Value
//取记录中指定字段参数
#define GetVALUE(mRs ,name) (mRs)-> Fields-> Item[(_variant_t(name))]-> Value
//取记录中指定字段参数,并转换为CString
#define GetSTRVALUE(mRs, name) CString((mRs)-> Fields-> Item[(_variant_t(name))]-> Value.bstrVal).GetBuffer(0)
#define RSGetVALUE(x) (_bstr_t(pRs-> GetCollect(x)))
#define DMPcomERR(e) dmpCOMerr(e,__LINE__,__FILE__, true);
//#define CREATEiNSTANCE(sp, riid) { HRESULT _hr = sp.CreateInstance(__uuidof(riid)); if (FAILED(_hr)) _com_issue_error(_hr); }
//========================================================================
#include "io.h "
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMyDataBase::CMyDataBase()
{
m_bConn = false;
}
CMyDataBase::~CMyDataBase()
{
CloseDB();
}
void CMyDataBase::dmpCOMerr(_com_error &e, int line, char *file, bool traceOnly)
{
CString ErrMsg;
ErrMsg.Format( " Line: %d File %s ", line, file);
_bstr_t bstrSource(e.Source());
_bstr_t bs = _bstr_t( " Error: ") + _bstr_t(e.Error()) + _bstr_t( " Msg: ")
+ _bstr_t(e.ErrorMessage()) + _bstr_t( " Description: ")
+ _bstr_t(e.Description()) + _bstr_t(ErrMsg) ;
if(!traceOnly)
MessageBox(0,bs,bstrSource, MB_OK);
ErrMsg.Format( "%s %s \n ", (char *) bs, (char *) bstrSource);
}
bool CMyDataBase::IsConnectedValid()
{
if (!m_bConn)
return false;
try
{
m_pConn-> Execute(L "select top 1 * from sysobjects ", NULL, adOptionUnspecified);
}
catch (_com_error&)
{
m_bConn = false;
return false;
}catch(...){}
return true;
}
bool CMyDataBase::OpenDB()
{
if (m_bConn)
return true;
try
{
CoInitialize(NULL);
m_pConn.CreateInstance(__uuidof(Connection));
m_pConn-> ConnectionString = _bstr_t(m_sConn);
m_pConn-> Open( " ", " ", " ", adConnectUnspecified);
m_bConn = true;
}
catch (_com_error& e)
{
m_bConn = false;
//DMPcomERR(e);`
return false;
}
catch (...)
{
return false;
}
return true;
}
void CMyDataBase::CloseDB()
{
if (m_bConn)
{
try
{
m_pConn-> Close();
}
catch (...)
{
}
m_bConn = false;
}
CoUninitialize();
}
void CMyDataBase::TrimStr(CString &sStr)
{
sStr.TrimLeft();
sStr.TrimRight();
}
void CMyDataBase::InitDBParam(CString sHost, CString sDBName, CString sUID, CString sPWD)
{
m_sDBHost = sHost;
m_sDBName = sDBName;
m_sUID = sUID;
m_sPWD = sPWD;
m_sConn.Format( "driver={sql server};server=%s;Database=%s;UID=%s;PWD=%s; ",
m_sDBHost, m_sDBName, m_sUID, m_sPWD);
}
bool CMyDataBase::ExecuteSQL(CString& strSQL)
{
if (!OpenDB())
return false;
try
{
_CommandPtr pCmd;
_RecordsetPtr pRs;
TESTHR(pCmd.CreateInstance(__uuidof(Command)));
TESTHR(pRs.CreateInstance(__uuidof(Recordset)));
pCmd-> ActiveConnection = m_pConn;
pCmd-> CommandText = _bstr_t(strSQL);
pCmd-> CommandType = adCmdText;
pCmd-> Parameters-> Refresh();
pRs = pCmd-> Execute(NULL, NULL, adCmdText);
if (pRs-> GetState() != adStateClosed)
pRs-> Close();
pRs.Release();
pCmd.Release();
}
catch (_com_error& e)
{
m_bConn = false;
DMPcomERR(e);
#ifdef _DEBUG
OutputDebugString(strSQL);
#endif
return false;
}
catch(...)
{
#ifdef _DEBUG
OutputDebugString(strSQL);
#endif
return false;
}
return true;
}
bool CMyDataBase::GetMTmsg(CMTMsg& Mtmsg)
{
Mtmsg.Reset();
if (!OpenDB())
return false;
CString strSQL;
try
{
_CommandPtr pCmd;
_RecordsetPtr pRs;
TESTHR(pCmd.CreateInstance(__uuidof(Command)));
TESTHR(pRs.CreateInstance(__uuidof(Recordset)));
strSQL.Format( "%s ", "select top 1 * from sms_send where status = 0 ");
pCmd-> ActiveConnection = m_pConn;
pCmd-> CommandText = _bstr_t(strSQL);
pCmd-> CommandType = adCmdText;
pCmd-> Parameters-> Refresh();
pRs = pCmd-> Execute(NULL, NULL, adCmdText);
if (!pRs-> adoEOF)
{
Mtmsg.m_iId = atoi((LPTSTR)RSGetVALUE(L "Id "));
Mtmsg.m_strMobile = (LPTSTR)RSGetVALUE(L "Mobile ");
Mtmsg.m_strContent = (LPTSTR)RSGetVALUE(L "content ");
Mtmsg.m_strEId = (LPTSTR)RSGetVALUE(L "Eid ");
pRs-> MoveNext();
}
if (pRs-> GetState() != adStateClosed)
pRs-> Close();
pRs.Release();
pCmd.Release();
}
catch (_com_error& e)
{
m_bConn = false;
DMPcomERR(e);
#ifdef _DEBUG
OutputDebugString(strSQL);
#endif
return false;
}
catch(...)
{
//LOG();
#ifdef _DEBUG
OutputDebugString(strSQL);
#endif
return false;
}
return true;
}
bool CMyDataBase::SetMtmsgFlag(int iId, int iStatus)
{
CString strSQL;
strSQL.Format( "update sms_send set status = %d where id = %d ", iStatus, iId);
return ExecuteSQL( strSQL );
}
bool CMyDataBase::MoveMtmsgToBak(int iId)
{
CString strSQL;
strSQL.Format( "insert into sms_Already_send select * from sms_send where id = %d ", iId);
if(ExecuteSQL( strSQL ))
{
strSQL.Format( "delete sms_send where id = %d ", iId);
return ExecuteSQL( strSQL );
}
return false;
}
[解决办法]
//调用
数据为MSSQL
CMyDataBase m_DB;\\这个变量就可以是全局啦.
m_Db.InitDBParam( "服务器地址或IP ", "库名 ", "loginname ", "password ");
if(!m_Db.OpenDB())
{
AfxMessageBox( "打开数据库错误! ");
return -1;
}
m_Db.CloseDB();//关闭数据库
//你参考一下这个类的CPP文件这个函数:以下一行是执行了一句SQL语句
bool CMyDataBase::MoveMtmsgToBak(int iId)
{
CString strSQL;
strSQL.Format( "insert into sms_Already_send select * from sms_send where id = %d ", iId);
if(ExecuteSQL( strSQL ))
{
strSQL.Format( "delete sms_send where id = %d ", iId);
return ExecuteSQL( strSQL );
}
return false;
}
[解决办法]
执行SQL参看:ExecuteSQL
取数据参考:GetMTmsg