用ADO通过sql语句执行存储过程.咋整?

aoyihuashao 2011-01-26 11:37:47
不是用哪种设置存储过程名,设置输入输出参数的方法.


而是用ADO直接执行一条SQL语句 如:EXEC PRO_SM_RECV '13800020020','Hello, this is a ismg.'
该怎么弄.


现在的方法(执行失败,但语句直接在数据库里执行是好的):

//##ModelId=4137D455008E
BOOL CAdoConnection::ExecuteEx(LPCTSTR strSQL, long lOptions)
{

if(AfxIsValidString(strSQL)==FALSE|| m_pConnection==NULL)
{
return FALSE;
}
try
{
m_pConnection->Execute(_bstr_t(strSQL), NULL, lOptions);
}
catch (_com_error e)
{
TRACE(_T("Warning: Execute 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return TRUE;
}


...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
aoyihuashao 2011-01-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zyq5945 的回复:]
e.ErrorMessage()改成(LPCTSTR)e.Description()看报什么错。
不行的话再用Command的Excute执行试试。
[/Quote]

[MERANT][ODBC Sybase ASE driver][SQL Server]Procedure PRO_SM_RECV expects parameter @PHONE, which was not supplied.

没提供参数
zyq5945 2011-01-26
  • 打赏
  • 举报
回复
e.ErrorMessage()改成(LPCTSTR)e.Description()看报什么错。
不行的话再用Command的Excute执行试试。
hztj2005 2011-01-26
  • 打赏
  • 举报
回复
孙鑫那本书最后一章,25章有例子。
见习学术士 2011-01-26
  • 打赏
  • 举报
回复
这种可以当做SQL直接执行的


_RecordsetPtr CMyJs::Execute(LPCTSTR lpSQL, long lOptions)
{
ASSERT(m_pConnection != NULL);
ASSERT(AfxIsValidString(lpSQL));
try
{
return m_pConnection->Execute(_bstr_t(lpSQL), NULL, lOptions);
}
catch (_com_error e)
{
m_strError = (LPCTSTR)e.Description();
return NULL;
}
}

//截取出来的执行代码
CString strSql;
strSql.Format("EXEC %s %s",mapParam["proname"].c_str(),(LPCTSTR)GetProcedureParam( mapParam ) );
if( CConfig::GetInstance().m_bLogGetUrl)
{
IBLOG(strSql);
}
map<CString,vector<CString> > mapRecordSet;
if( !DBtoMap( strSql,mapRecordSet,adCmdText ) || 0 == mapRecordSet.size() )
{
return FALSE;
}


//这个函数可以把执行结果保存到map里面。支持多条记录集返回
BOOL CMyJs::DBtoMap( CString strSql,map<CString,vector<CString> >& mapRecordSet,long lOption)
{
HRESULT hr;
Fields* pFields = NULL;
long lnColCount;
try
{

m_pRecordset = Execute( (LPCTSTR)strSql,lOption );
size_t nRecordSet = 0;
while( m_pRecordset != NULL )
{
hr = m_pRecordset->get_Fields( &pFields );
if( SUCCEEDED( hr ) )
{
pFields->get_Count( &lnColCount );
pFields->Release();
pFields = NULL;
_variant_t vtFld;
if( m_pRecordset->adoEOF )
{
m_pRecordset->Close();
return FALSE;
}
while( !m_pRecordset->adoEOF )
{
for( long nIndex = 0 ; nIndex < lnColCount; nIndex++ )
{
BSTR bstrColName;
m_pRecordset->Fields->Item[nIndex]->get_Name( &bstrColName );
CString strColName;
strColName.Format("%s_r%d",(CString)bstrColName,nRecordSet);
vtFld = m_pRecordset->Fields->GetItem(nIndex)->Value;
mapRecordSet[strColName].push_back( (VariantToString( vtFld)));
SysFreeString(bstrColName);
}
m_pRecordset->MoveNext();
}
long lRec = 0;
_RecordsetPtr pRecordSet = m_pRecordset;
m_pRecordset = m_pRecordset->NextRecordset( (VARIANT*)lRec );
CloseRecordSet(pRecordSet);
nRecordSet++;
}
}
return TRUE;

}
catch(_com_error &e)
{
m_strError.Format("SQL执行失败!\r\n错误信息:%s SQL:%s",(char*)(e.Description()),(LPCTSTR)strSql);
}
return FALSE;
}
aoyihuashao 2011-01-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 grf9527 的回复:]
自己在组装sql语句的时候
把参数加上
这个工作可以在这个函数里
也可以在参数传入前
[/Quote]

刚才搞错了 ,忘了改配置文件 那是直接执行
执行这个:
EXEC PRO_SM_RECV '13800020020','Hello, this is a ismg.'

错误是:
[MERANT][ODBC Sybase ASE driver]String data translation caused data truncation.
grf9527 2011-01-26
  • 打赏
  • 举报
回复
自己在组装sql语句的时候
把参数加上
这个工作可以在这个函数里
也可以在参数传入前

16,472

社区成员

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

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

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