ADO中如何调用存储过程,请给详细的说明。我想多给,可是只让我给31分

xwchena 2001-07-09 09:14:10
在ADO中如何调用存储过程?用什么命令?存储过程的参数如何传入?如何获得存储过程返回的参数?在输入参数时,C中的数据类型怎么转换成SQL对应的类型?
strname.vt=VT_I2中的vt是什么?VT_I2又是什么?还有类似的VT_BOOL、VT_BSTR、VT_BSTRT、VT_CY、VT_DATE、VT_EMPTY、VT_ERROR、VT_I4、VT_R4、VT_R8、VT_UI1
这些又代表什么?
...全文
273 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
hawkcat 2001-07-15
  • 打赏
  • 举报
回复
m_pUserSet=cmd1->Execute(...)
m_pUserSet.GetRows();
然后使用安全数组得到这些结果(safearray)
使用safearraygetelement关键字在msdn上找相应的例子
hawkcat 2001-07-15
  • 打赏
  • 举报
回复
最好的参考资料就是msdn
hawkcat 2001-07-15
  • 打赏
  • 举报
回复
你要返回的是结果集?
使用getrows
xwchena 2001-07-11
  • 打赏
  • 举报
回复
谢谢hawkcat(),对输入参数大概清楚了,但是对于怎么显示存储过程的返回值还不知道:对于
para2=Cmd1->CreateParameter ("@nServiceID",adInteger,adParamOutput,sizeof(int),vtMissing);
执行完存储过程后,我怎么获得nServiceID的值?给个代码说明一下吧。急着用啊!!!!!
只要解决了,分数不成问题
xwchena 2001-07-11
  • 打赏
  • 举报
回复
高手在吗?
hawkcat 2001-07-11
  • 打赏
  • 举报
回复
_variant_t var;
var.vt=VT_I4;
var.intval=fid;
para1=m_pCommand->CreateParameter("@ywpos",adInteger, adParamInput,sizeof
(int),fid);

goodluck
xwchena 2001-07-11
  • 打赏
  • 举报
回复
大伙帮帮忙啊!!!!!!!!!!!!!!
xwchena 2001-07-11
  • 打赏
  • 举报
回复
可是最上面的代码中Cmd1->Execute (NULL,NULL ,adCmdStoredProc)执行后并没有和某个记录集关联啊!要如何把m_pUserSet作为Cmd1->Execute()返回结果的记录集?
ZHENG017 2001-07-11
  • 打赏
  • 举报
回复
if (!m_pUserSet->adoEOF )
{
long kk=0;
do {
kk=m_pUserSet->GetFields ()->GetCount ();
_bstr_t filedname[10];
for (long uu=0;uu<kk;uu++)
{
filedname[uu]=m_pUserSet->GetFields ()->GetItem ((_variant_t)uu)->GetName ();
long width=m_pUserSet->GetFields ()->GetItem ((_variant_t)uu)->GetDefinedSize ();
long width1=m_pUserSet->GetFields ()->GetItem ((_variant_t)uu)->GetActualSize ();
filed=m_pUserSet->GetCollect (filedname[uu]);
CString temp="";
temp.Insert (0,(char*)_bstr_t(filed));

str+=temp;
}


m_pUserSet->MoveNext ();
}while (!m_pUserSet->adoEOF );


}
ZHENG017 2001-07-11
  • 打赏
  • 举报
回复
看看这个了.
http://www.csdn.net/expert/topic/187/187757.shtm
xwchena 2001-07-11
  • 打赏
  • 举报
回复
para=Cmd1->CreateParameter ("@strLoginName",adVarChar,adParamInput,20,_variant_t("final"));
Cmd1->Parameters ->Append (para);
para1=Cmd1->CreateParameter "@strVirtualEq_Type",adVarChar,adParamInput,20,
_variant_t("V_TH"));
Cmd1->Parameters ->Append (para1);
这两句作用是不是把para、para1这些值放在Cmd1的参数集合中?

Cmd1->Execute (NULL,NULL ,adCmdStoredProc);
Final=Cmd1->Parameters ->GetItem (_variant_t((long)0))->GetValue();
执行完Cmd->Execute后,是不是把返回值又存到参数的集合中?然后Final那句就到新的参数集合中取得返回值?

不知有没有理解错?如果是这样,那么当返回多条记录时,怎么移到下一条记录去取值?

xwchena 2001-07-10
  • 打赏
  • 举报
回复
还是不太明白
xwchena 2001-07-10
  • 打赏
  • 举报
回复
没人回答吗?
hawkcat 2001-07-10
  • 打赏
  • 举报
回复
SQL存储过程:
Int HT_Virtual_Login @strLoginName ,@strVirtualEq_Type,@nServiceID OUTPUT,@strExServerIP OUTPUT,@nPortID OUTPUT,@nServiceTime OUTPUT,@nInterruptTime OUTPUT
1,2中表示SQL存储过程的调用的返回值参数的建立
后面的是参数变量的建立
final就是返回值
v_th使我自己定义的
good luck
xwchena 2001-07-10
  • 打赏
  • 举报
回复
hawkcat,帮我解决一下问题吧,31分全送!!!
xwchena 2001-07-10
  • 打赏
  • 举报
回复
有几点还弄不明白,望指教:
1、为什么对参数para要执行两次Cmd1->CreateParameter? 各有什么作用?
para=Cmd1->CreateParameter ("RETVAL",adInteger,adParamReturnValue,sizeof
(int),vtMissing);返回的是什么值?
2、para=Cmd1->CreateParameter("@strLoginName",adVarChar,adParamInput,20,
_variant_t("final"));不是存储过程的输入参数吗?那final返回的是什么值?
3、para2=Cmd1->CreateParameter ("@nServiceID",adInteger,adParamOutput,sizeof
(int),vtMissing);不是输出参数吗?如何得到输出结果?

我模仿你的程序也写了一个调用存储过程的:
存储过程:
CREATE PROCEDURE Execjw @ywpos int, @st tinyint
AS
begin
update files set fstatus=@st where fid=@ywpos
end
(fstatus是tinyint型、fid是int型)

调用函数:
USHORT Test(int fid,BYTE fstatus)
{
if(!AfxOleInit())
{
AfxMessageBox("Ole初始化失败");
return 0;
}
_ConnectionPtr m_pConnection;
_CommandPtr m_pCommand;
_RecordsetPtr m_pRecordset;

_ParameterPtr para1;
_ParameterPtr para2;

CString strOpen="DSN=agent;UID=;PWD=";
_bstr_t strSProc=(L"Execjw");
try
{
m_pConnection.CreateInstance(__uuidof(Connection));
m_pConnection->Open((const char*)strOpen,"","",-1);
}
catch(...)
{
AfxMessageBox("Ole初始化失败");
return FALSE;
}
try
{
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection=m_pConnection;
m_pCommand->CommandText=_bstr_t(strSProc);
m_pCommand->CommandType=adCmdStoredProc;

para1=m_pCommand->CreateParameter("@ywpos",adInteger,
adParamInput,sizeof(int),_variant_t(fid));
m_pCommand->Parameters->Append(para1);
para2=m_pCommand->CreateParameter("@st",adTinyInt,
adParamInput,1,_variant_t(fstatus));
m_pCommand->Parameters->Append(para2);
m_pCommand->Execute(NULL,NULL,adCmdStoredProc);
return 1;
}
catch(...)
{
AfxMessageBox("error");
return 0;
}
m_pCommand->Release();
m_pConnection->Close();
}
fid和fstatus就是要传给存储过程的两个值,我的理解就是在m_pCommand->CreateParameter
函数中把他们赋值给对应的参数,不知对不对?另外编译时
para1=m_pCommand->CreateParameter("@ywpos",adInteger, adParamInput,sizeof
(int),_variant_t(fid));这句出错,提示说
cannot convert from 'int' to 'class _variant_t',不知道要怎么改。

希望大家给予帮助,我会多给分的!!


守田人 2001-07-09
  • 打赏
  • 举报
回复
不清楚
xwchena 2001-07-09
  • 打赏
  • 举报
回复
1、para=Cmd1->CreateParameter ("RETVAL",adInteger,adParamReturnValue,sizeof
(int),vtMissing);
2、Cmd1->Parameters ->Append (para);
3、para=Cmd1->CreateParameter ("@strLoginName",adVarChar,adParamInput,20,
_variant_t("final"));
4、Cmd1->Parameters ->Append (para);
5、para1=Cmd1->CreateParameter( "@strVirtualEq_Type",adVarChar,adParamInput,20,
_variant_t("V_TH"));
6、para2=Cmd1->CreateParameter ("@nServiceID",adInteger,adParamOutput,
sizeof(int),vtMissing);
请问1中各个参数都代表了什么?为什么para要赋值两次?各有什么不同?还有V_TH和vtMissing是代表什么?

执行完Cmd1->Execute (NULL,NULL ,adCmdStoredProc)后是不是已经获得了输出参数的值,这些值存放在哪里?
Final=Cmd1->Parameters ->GetItem (_variant_t((long)0))->GetValue();作用是什么?
(_variant_t((long)0)的作用是什么?

hawkcat 2001-07-09
  • 打赏
  • 举报
回复
我项目中的:
CString strTmp;
CString m_status;
/* CString m_sdatasource;
CString m_sUserID;
CString m_sPassword;

m_sdatasource="hawkcat";
m_sUserID="user1";
m_sPassword="user1";
strTmp.Format ("Provider=sqloledb;Data Source=%s;Initial Catalog=transport;User Id=%s;Password=%s",m_sdatasource,m_sUserID,m_sPassword);
*/ _bstr_t strTmp1="Provider=sqloledb;Data Source=10.13.31.133;Initial Catalog=dlsdb;User Id=sa;Password=";
_bstr_t bstrSQLServerConnect;
_bstr_t bstrProc=(L"HT_Virtual_Login");
_variant_t Final;
bstrSQLServerConnect=strTmp1;
m_status="Empty file";

CoInitialize(NULL);

_ConnectionPtr conn1;
_CommandPtr Cmd1;
bool bvalid=false;
// LPSTR bstrEmpty=NULL;
try
{
conn1.CreateInstance(__uuidof(Connection));
conn1->ConnectionString =bstrSQLServerConnect;
conn1->Open ("","","",adConnectUnspecified);
if(conn1->State ==adStateOpen)
MessageBox("open");
Cmd1.CreateInstance (__uuidof(Command));
Cmd1->ActiveConnection =conn1;
Cmd1->CommandText =_bstr_t(bstrProc);
Cmd1->CommandType=adCmdStoredProc;
_ParameterPtr para;
_ParameterPtr para1;
_ParameterPtr para2;
_ParameterPtr para3;
_ParameterPtr para4;
_variant_t var;
/* para=Cmd1->CreateParameter ("RETVAL",adInteger,adParamReturnValue,sizeof(int),var);
Cmd1->Parameters ->Append (para);
LPSTR str="user1";
para=Cmd1->CreateParameter ("@LoginName",adVarChar,adParamInput,30,_variant_t(str));
Cmd1->Parameters ->Append (para);
para1=Cmd1->CreateParameter ("@PWD",adVarChar,adParamInput,30,_variant_t("user1"));
Cmd1->Parameters ->Append (para1);
para2=Cmd1->CreateParameter ("@Order_Id",adInteger,adParamInput,sizeof(int),_variant_t("1"));
Cmd1->Parameters ->Append (para2);
para3=Cmd1->CreateParameter ("@Eq_Type",adVarChar,adParamInput,10,_variant_t("TH"));
Cmd1->Parameters ->Append (para3);
para4=Cmd1->CreateParameter ("@curEq_Num",adVarChar,adParamOutput,30,vtMissing);
Cmd1->Parameters ->Append (para4);
*/ para=Cmd1->CreateParameter ("RETVAL",adInteger,adParamReturnValue,sizeof(int),vtMissing);
Cmd1->Parameters ->Append (para);
para=Cmd1->CreateParameter ("@strLoginName",adVarChar,adParamInput,20,_variant_t("final"));
Cmd1->Parameters ->Append (para);
para1=Cmd1->CreateParameter ("@strVirtualEq_Type",adVarChar,adParamInput,20,_variant_t("V_TH"));
Cmd1->Parameters ->Append (para1);
para2=Cmd1->CreateParameter ("@nServiceID",adInteger,adParamOutput,sizeof(int),vtMissing);
Cmd1->Parameters ->Append (para2);
para3=Cmd1->CreateParameter ("@strExSeverIP",adVarChar,adParamOutput,20,vtMissing);
Cmd1->Parameters ->Append (para3);
para4=Cmd1->CreateParameter ("@nPortID",adInteger,adParamOutput,sizeof(int),vtMissing);
Cmd1->Parameters ->Append (para4);
para=Cmd1->CreateParameter ("@nServiceTime",adInteger,adParamOutput,sizeof(int),vtMissing);
Cmd1->Parameters ->Append (para);
para=Cmd1->CreateParameter ("@nInterruptTime",adInteger,adParamOutput,sizeof(int),vtMissing);
Cmd1->Parameters ->Append (para);
Cmd1->Execute (NULL,NULL ,adCmdStoredProc);

Final=Cmd1->Parameters ->GetItem (_variant_t((long)0))->GetValue();
if(!Final.intVal )
MessageBox("errordsafkj");
strTmp.Format ("%s",CrackStrVariant(Final));
MessageBox(strTmp);
_bstr_t st(var);
}
catch(_com_error &e)
{
m_status=e.ErrorMessage ();
::CoUninitialize();
}
catch(...)
{
m_status="Error while executing the import";
::CoUninitialize();
}
Cmd1->Release ();
conn1->Close ();
::CoUninitialize();

16,551

社区成员

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

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

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