首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

怎么编写这样一个函数,

2012-02-09 
如何编写这样一个函数,急啊。假如有一SQL数据库test,一用户表user.编写这样一个函数,功能是1.连接数据库(使

如何编写这样一个函数,急啊。
假如有一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

热点排行