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是不是上面有什么地方的代码写错了啊

解决方案 »

  1.   

    在APP::InitInstance加上CoInitialize()试一下
      

  2.   

    ExecNonQuery和数据库连接最好在同一个线程。还有就是ADO的版本,最好用新的。
      

  3.   

    谢谢楼上各位但是我在类的构造函数中写了的啊
    CDBExec::CDBExec(void)
    {
    ::CoInitialize(NULL);
    }
      

  4.   

    wangk(倒之) 是在一个线程中的
      

  5.   

    shawnwan() 谢谢你帮我顶我说的很清楚了啊出现的问题我都写在上面了啊
      

  6.   

    pConn->conn->Execute(sSql.AllocSysString() , NULL , adCmdText);
    或则用_CommandPtr的Execute试试。
      

  7.   

    你这个对象是在一个线程中实例化的吗?
    最好再线程开始::CoInitialize(NULL);
      

  8.   

    ::CoInitialize(NULL);你在子线程的开始处再初始化一次
      

  9.   

    这句sql我在查询分析器执行都没问题啊
      

  10.   

    Top
    回复人:vieri_ch(尘雨-自在飞花轻似梦,无边丝雨细如愁) ( 五级(中级)) 信誉:99我现在是加在数据库访问类的构造函数里的CDBExec::CDBExec(void)
    {
    ::CoInitialize(NULL);
    }
      

  11.   

    sSql.AllocSysString()看一下它是否正确
      

  12.   

    你还是用_CommandPtr,吧。
    -_-||
    _ConnectionPtr的实例用Open方法试试。
      

  13.   

    回复人:wangk(倒之) ( 两星(中级)) 信誉:102  2007-02-01 13:07:06  得分:0

    你还是用_CommandPtr,吧。
    -_-||
    _ConnectionPtr的实例用Open方法试试。
    -----------------------------------------------
    我换成CommandPtr也是一样的错误
      

  14.   

    晕,没道理我用的好好的。_CommandPtr你是怎么使用的?返回什么错误。
    msado15以上版本?
      

  15.   

    是msado15的版本还是返回一样的错误
      

  16.   

    我在sqlserver的事件探察器里都看到执行这句了SQL:BatchCompleted delete from TicketPrice where CityFrom = '北京' and CityTo = '广州' TODO: <产品名> sa 0 10 0 346 2884 53 2007-02-01 14:06:57.653 但是数据库却没删除数据程序也是抛出异常