***********************请教一个关于ADO执行数据库的问题***********************
CDBExec::CDBExec(void)
{
::CoInitialize(NULL);
}
CDBExec::~CDBExec(void)
{
std::vector<PDB_CONN>::iterator iter = m_vtDBConn.begin();
while(iter != m_vtDBConn.end())
{
(*iter)->conn->Close();
delete (*iter);
}
m_vtDBConn.clear();
m_Command.Release();
m_ParameterReturn.Release();
::CoUninitialize();
}
/*=========================================================================================*/
// 函数名称:InitializeConn
// 简要描述:将数据打包
//
// 参数描述
// 无参数
//
// 返回值:
// @类型: BOOL
// [true] 所有数据库连接初始化成功
// [false]非所有数据库连接初始化成功
/*=========================================================================================*/
BOOL CDBExec::InitializeConn()
{
char szPath[256];
::GetCurrentDirectory(256 , szPath);
strcat(szPath , "\\db.ini");
CStdioFile file;
CFileException fileExp;
CString sDBName;
file.Open(szPath , CFile::modeRead , &fileExp);
CString sConnStr;
while(file.ReadString(sDBName))
{
PDB_CONN pConn = new DB_CONN();
pConn->sDBName = sDBName;
pConn->conn.CreateInstance(__uuidof(Connection));
pConn->conn->ConnectionTimeout = 5;
sConnStr.Format("Provider=SQLOLEDB;Data Source=localhost;Initialize Catalog=%s;Trusted_Connection=yes;" , sDBName);
try
{
pConn->conn->Open(sConnStr.AllocSysString() , "", "" , adModeUnknown);
}
catch(_com_error e)
{
std::vector<PDB_CONN>::iterator iter;
while(iter != m_vtDBConn.end())
{
(*iter)->conn->Close();
delete (*iter);
}
m_vtDBConn.clear();
::CoUninitialize();
return FALSE;
}
m_vtDBConn.push_back(pConn);
}
file.Close();
m_Command.CreateInstance(__uuidof(Command));
m_ParameterReturn.CreateInstance(__uuidof(Parameter));
m_ParameterReturn->Name = "@return";
m_ParameterReturn->Type = adInteger;
m_ParameterReturn->Size = 4;
m_ParameterReturn->Direction = adParamReturnValue;
m_ParameterReturn->Value = (_variant_t)1;
m_Record.CreateInstance(__uuidof(Recordset));
return TRUE;
}
/*=========================================================================================*/
// 函数名称:GetConn
// 简要描述:根据数据库名取数据库连接
//
// 参数描述
// @参数类型 CString @参数名 sDBName @参数描述 数据库名
//
// 返回值:
// @类型: PDB_CONN
// 数据库连接对应的结构体
/*=========================================================================================*/
PDB_CONN CDBExec::GetConn(CString sDBName)
{
std::vector<PDB_CONN>::iterator iter = m_vtDBConn.begin();
while(iter != m_vtDBConn.end())
{
if((*iter)->sDBName.MakeLower() == sDBName.MakeLower())
{
if((*iter)->conn->GetState() != 1)
{
try
{
CString sConnStr;
sConnStr.Format("Provider=SQLOLEDB;Data Source=localhost;Initialize Catalog=%s;Trusted_Connection=yes;" , sDBName);
(*iter)->conn->Open(sConnStr.AllocSysString() , "" , "" , adModeUnknown);
}
catch(_com_error e)
{
CString sMessage = e.ErrorMessage();
AfxMessageBox("连接数据库失败");
return NULL;
}
}
return (*iter);
}
}
AfxMessageBox("找不到指定的数据库");
return NULL;
}
/*=========================================================================================*/
// 函数名称:ExecNonQuery
// 简要描述:执行数据库操作,数据库无返回值
//
// 参数描述
// @参数类型 CString @参数名 sDBName @参数描述 数据库名
// @参数类型 CString @参数名 sSql @参数描述 sql字符串
//
// 返回值:
// [BOOL]
// [true] 执行成功
// [false] 执行失败
/*=========================================================================================*/
BOOL CDBExec::ExecNonQuery(CString sSql, CString sDBName)
{
PDB_CONN pConn = GetConn(sDBName);
if(pConn == NULL)
return FALSE;
_variant_t rowsAffected;
try
{
pConn->conn->Execute(sSql.AllocSysString() , &rowsAffected , adCmdText);
}
catch(_com_error e)
{
//CString sError = e.ErrorMessage();
//AfxMessageBox(sError);
return FALSE;
}
return TRUE;
}
我的数据库操作类是象上面这样写的
我执行ExeNonQuery()
Sql语句是这样写的
delete from TicketPrice where CityFrom = '北京' and CityTo = '广州'
数据库是连的对的,但是错误却提示#IDispatch error #3127
是不是上面有什么地方的代码写错了啊