_CommandPtr 执行Execute 返回结果集错误,谁能找到问题所在?

sunny6281 2009-11-17 07:04:04
long CADOAccess::ExecuteScalar(LPCTSTR strSQL
, CString& strResult
, CommandTypeEnum enumCmdType
, int iParaNum
, _PARAMETER_INFO paraInfo[])
{
_ParameterPtr pPara;
_variant_t varResult;

if (m_pCommand == NULL)
{
m_pCommand.CreateInstance("ADODB.Command");
}

m_pCommand->CommandText = strSQL;
m_pCommand->ActiveConnection = m_pConnection;
m_pCommand->CommandType = enumCmdType;

for (int i = 0; i < iParaNum; i++)
{
pPara = m_pCommand->CreateParameter(paraInfo[i].strParaName
, paraInfo[i].enumDataType, paraInfo[i].enumParaDirec
, paraInfo[i].lParaSize, paraInfo[i].strParaValue);
m_pCommand->Parameters->Append((IDispatch*)pPara);
}

m_pRecordset = m_pCommand->Execute(NULL, NULL, enumCmdType);

varResult = m_pRecordset->Collect[0];
if (varResult.vt == VT_NULL || varResult.vt == VT_EMPTY)
{
strResult = "";
}
else
{
strResult = varResult;
}

CloseRecordset();

return m_pRecordset->RecordCount;
}

m_pRecordset->RecordCount始终为-1
并且在varResult = m_pRecordset->Collect[0];处报错....
...全文
243 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunny6281 2009-11-23
  • 打赏
  • 举报
回复
散分
sunny6281 2009-11-23
  • 打赏
  • 举报
回复
自己搞定了
原因可能是数据库连接的属性设置问题。
fandh 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sunny6281 的回复:]
SQL语句没问题  在SQL server里面测试过
[/Quote]
确信SQL能查到结果么?你好像没有对if(m_pRecordset->BOF)做判断,防止查到的为空!

sunny6281 2009-11-20
  • 打赏
  • 举报
回复
SQL语句没问题 在SQL server里面测试过
a469367940 2009-11-20
  • 打赏
  • 举报
回复
不会吧,这样还没结果,这两天我也在写这些,你的没有错哦!
ToperRay 2009-11-19
  • 打赏
  • 举报
回复
不知道用try catch的同学不是好同学。

江川 2009-11-19
  • 打赏
  • 举报
回复
要确保你的SQL语句正确,如果是SQL,请现在查询分析器中验证语句的正确性。
一般语句正确打开不会出问题的。
sunny6281 2009-11-19
  • 打赏
  • 举报
回复
sunny6281 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 laowu_ 的回复:]
软件有大美,调试见真功。
[/Quote]

调试代码:
CString strSql;
CString strTmp;
CADOAccess db;

strSql = "SELECT SYSDATETIME()";
db.ConnectSQLServer("MyDB", "MyTstDB", "sa", "88888888");
db.ExecuteScalar(strSql, strTmp);
Msg.Company, Msg.Msg, Msg.MsgCount",strTmp);
db.CloseConnection();

MessageBox(strTmp);

//对象构造器:
CADOAccess::CADOAccess()
{
try
{
CoInitialize(NULL);
m_pConnection.CreateInstance("ADODB.Connection");
}
catch(...)
{
TRACE(_T("Warning: 发生未知错误:"));
}
}

//数据库连接代码:
BOOL CADOAccess::ConnectSQLServer(CString strDBSrc, CString strDBName
, CString strUser, CString strPwd
, ConnectOptionEnum enumConnectOption)
{
CString strConnect ="Provider=SQLOLEDB.1; Data Source=%s;";
strConnect.Append(" Initial Catalog=%s; User ID=%s; PWD=%s");
m_strConnection.Format(strConnect, strDBSrc, strDBName, strUser, strPwd);
return OpenConnection(m_strConnection, enumConnectOption);
}


调试信息:
“DBTest.exe”: 已加载“C:\Program Files\Common Files\System\msadc\msadcer.dll”,未加载任何符号。
DBTest.exe 中的 0x7c812a6b 处最可能的异常: Microsoft C++ exception: _com_error @ 0x0012f114 。
Warning: ExecuteScalar 发生异常. 错误信息: Unknown error 0x800A0CC1; 文件: e:\work\telstaff\prog\dbtest\adoaccess.cpp; 行: 333
_JeffreyWu 2009-11-18
  • 打赏
  • 举报
回复
软件有大美,调试见真功。
sunny6281 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liuxiaoyi666 的回复:]
你先判断一下EOF BOF

怀疑是没有返回结果...recordset是空的
[/Quote]
判断过 recordset不为空
m_pRecordset->adoBOF ,m_pRecordset->adoBOF都等于0
  • 打赏
  • 举报
回复
你先判断一下EOF BOF

怀疑是没有返回结果...recordset是空的
sunny6281 2009-11-17
  • 打赏
  • 举报
回复
m_pRecordset = m_pCommand->Execute(NULL, NULL, enumCmdType);
这一句可以正常执行,但是对m_pRecordset的操作出现异常
sunny6281 2009-11-17
  • 打赏
  • 举报
回复
long CADOAccess::ExecuteScalar(LPCTSTR strSQL
, CString& strResult
, CommandTypeEnum enumCmdType
, int iParaNum
, _PARAMETER_INFO paraInfo[])
{
_ParameterPtr pPara;
_variant_t varResult;

try
{
if (m_pCommand == NULL)
{
m_pCommand.CreateInstance("ADODB.Command");
}

m_pCommand->CommandText = strSQL;
m_pCommand->ActiveConnection = m_pConnection;
m_pCommand->CommandType = enumCmdType;

for (int i = 0; i < iParaNum; i++)
{
pPara = m_pCommand->CreateParameter(paraInfo[i].strParaName
, paraInfo[i].enumDataType, paraInfo[i].enumParaDirec
, paraInfo[i].lParaSize, paraInfo[i].strParaValue);
m_pCommand->Parameters->Append((IDispatch*)pPara);
}

m_pRecordset = m_pCommand->Execute(NULL, NULL, enumCmdType);

varResult = m_pRecordset->Collect[0];
if (varResult.vt == VT_NULL || varResult.vt == VT_EMPTY)
{
strResult = "";
}
else
{
strResult = varResult;
}

CloseRecordset();
}
catch (_com_error e)
{
TRACE(_T("Warning: GetMode 发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return -1;
}
return m_pRecordset->RecordCount;
}
sunny6281 2009-11-17
  • 打赏
  • 举报
回复
好 加上try

long CADOAccess::ExecuteScalar(LPCTSTR strSQL
, CString& strResult
, CommandTypeEnum enumCmdType
, int iParaNum
, _PARAMETER_INFO paraInfo[])
{
_ParameterPtr pPara;
_variant_t varResult;

try
{
if (m_pCommand == NULL)
{
m_pCommand.CreateInstance("ADODB.Command");
}

m_pCommand->CommandText = strSQL;
m_pCommand->ActiveConnection = m_pConnection;
m_pCommand->CommandType = enumCmdType;

for (int i = 0; i < iParaNum; i++)
{
pPara = m_pCommand->CreateParameter(paraInfo[i].strParaName
, paraInfo[i].enumDataType, paraInfo[i].enumParaDirec
, paraInfo[i].lParaSize, paraInfo[i].strParaValue);
m_pCommand->Parameters->Append((IDispatch*)pPara);
}

m_pRecordset = m_pCommand->Execute(NULL, NULL, enumCmdType);

m_pRecordset
varResult = m_pRecordset->Collect[0];
if (varResult.vt == VT_NULL || varResult.vt == VT_EMPTY)
{
strResult = "";
}
else
{
strResult = varResult;
}

CloseRecordset();
}
catch (_com_error e)
{
TRACE(_T("Warning: GetMode 发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return -1;
}
return m_pRecordset->RecordCount;
}
ziplj 2009-11-17
  • 打赏
  • 举报
回复
这么多数据库操作都不见一个try catch...

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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