***********************请教一个关于ADO执行数据库的问题***********************

ControlCoder98 2007-02-01 10:37:11
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

是不是上面有什么地方的代码写错了啊

...全文
456 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
美丽海洋 2007-02-01
  • 打赏
  • 举报
回复
sSql.AllocSysString()

看一下它是否正确

ControlCoder98 2007-02-01
  • 打赏
  • 举报
回复
Top
回复人:vieri_ch(尘雨-自在飞花轻似梦,无边丝雨细如愁) ( 五级(中级)) 信誉:99

我现在是加在数据库访问类的构造函数里的

CDBExec::CDBExec(void)
{
::CoInitialize(NULL);
}
ControlCoder98 2007-02-01
  • 打赏
  • 举报
回复
这句sql我在查询分析器执行都没问题啊
尘雨 2007-02-01
  • 打赏
  • 举报
回复
::CoInitialize(NULL);你在子线程的开始处再初始化一次
美丽海洋 2007-02-01
  • 打赏
  • 举报
回复
搂住测试以下别的正确的语句是不是有错 要是有错就是数据库的连接问题 要是没有错 搂住的这句话可能有问题。
ControlCoder98 2007-02-01
  • 打赏
  • 举报
回复
帮忙啊
ControlCoder98 2007-02-01
  • 打赏
  • 举报
回复
是在子线程中.不是在主线程.有什么问题吗?
ControlCoder98 2007-02-01
  • 打赏
  • 举报
回复
是的

我是在一个新的线程中实例子化的
尘雨 2007-02-01
  • 打赏
  • 举报
回复
你这个对象是在一个线程中实例化的吗?
最好再线程开始::CoInitialize(NULL);
ControlCoder98 2007-02-01
  • 打赏
  • 举报
回复
改成NULL后还是出错
ControlCoder98 2007-02-01
  • 打赏
  • 举报
回复
好的

我先试试
wangk 2007-02-01
  • 打赏
  • 举报
回复
pConn->conn->Execute(sSql.AllocSysString() , NULL , adCmdText);
或则用_CommandPtr的Execute试试。
ControlCoder98 2007-02-01
  • 打赏
  • 举报
回复
shawnwan()

谢谢你帮我顶

我说的很清楚了啊

出现的问题我都写在上面了啊
ControlCoder98 2007-02-01
  • 打赏
  • 举报
回复
wangk(倒之)

是在一个线程中的

shawnwan 2007-02-01
  • 打赏
  • 举报
回复
问之前把问题说清楚
ControlCoder98 2007-02-01
  • 打赏
  • 举报
回复
谢谢楼上各位

但是我在类的构造函数中写了的啊
CDBExec::CDBExec(void)
{
::CoInitialize(NULL);
}
wangk 2007-02-01
  • 打赏
  • 举报
回复
ExecNonQuery和数据库连接最好在同一个线程。

还有就是ADO的版本,最好用新的。
Elysium 2007-02-01
  • 打赏
  • 举报
回复
在APP::InitInstance加上CoInitialize()试一下
ControlCoder98 2007-02-01
  • 打赏
  • 举报
回复
ControlCoder98 2007-02-01
  • 打赏
  • 举报
回复
谢谢
加载更多回复(7)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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