mfc调用SQL存储过程的问题???

时间:2023-02-08 15:48:02
我在SQL里建立了一个存储过程,请问在VC里调用不啊?以下为建立的存储过程
create procedure reader_insert
(@p_Rid varchar(12),
 @p_Rname varchar(12),
 @p_Rno varchar(12),
 @p_Runit varchar(12),
 @p_Rindentify varchar(10),
 @p_Rsex char(2),
 @p_Rtel varchar(12),
 @p_Rbegin datetime,
 @p_Rend datetime,
 @p_Rfoul char(2),
 @p_Rremark varchar(50)=null)
as
 insert into reader(Rid,Rname,Rno,Runit,Ridentify,Rsex,Rtel,Rbegin,Rend,Rremark)
values(@p_Rid,@p_Rname,@p_Rno,@p_Runit,@p_Rindentify,@p_Rsex,@p_Rtel,@p_Rbegin,@p_Rend,@p_Rremark)
还需要什么输出参数不啊?如果能直接调用这存储过程,语句怎么用啊?谢谢啊

8 个解决方案

#1


ADO方式执行存储过程,带参数传递,你可以参考下

//执行存储过程。
_RecordsetPtr& ADOConn::ExecuteSP(_bstr_t bstrSQL, _variant_t vtdays)
{
try
{
// 是否已经连接数据库
if(m_pConnection == NULL)
OnInitADOConn();
// Connection对象的Execute方法:(_bstr_t CommandText, 
// VARIANT * RecordsAffected, long Options ) 
// 其中CommandText是命令字串,通常是SQL命令。
// 参数RecordsAffected是操作完成后所影响的行数, 
// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存储过程;adCmdUnknown-未知
m_pCommand.CreateInstance(__uuidof(Command));
m_pRecordset.CreateInstance(__uuidof(Recordset));

m_pCommand->ActiveConnection = m_pConnection;
m_pCommand->CommandText = bstrSQL;//存储过程名
m_pCommand->PutCommandType(adCmdStoredProc);
m_pCommand->Parameters->Refresh();//从数据库查询参数信息
//接下来对每一个参数赋值。
long cnt = m_pCommand->Parameters->GetCount();//取得参数的个数
for(long k = 1; k<cnt; k++)
{//由于ADO中认为返回值是第一个参数, 因此这里用k=1过滤第一个参数
m_pCommand->Parameters->GetItem(k)->Value = vtdays; //按存储过程的参数顺序给参数赋值。
}
//执行这个存储过程
m_pRecordset = m_pCommand->Execute(0,0,adCmdStoredProc);
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
}
return m_pRecordset;
}

#2


代码大概如楼上,对于输出参数,Parameter对象有它的属性标明这是一个输入参数还是输出参数(必须和存储过程的定义一致),这样执行完之后,输出参数就会被赋值给那个Parameter。

#3


也就是说我如果象插入这些不关心输出的存储过程,就可以不需要输出参数,而直接调用上面的存储过程也可以?

#4




我上面调用的存储过程是有参数的,你不管参数就可以了

#5


但是插入要从窗体中获得插入的参数,你上面的给参数赋直还是要要吧?

#6


ExecuteSP(_bstr_t bstrSQL, _variant_t 参数1,_variant_t 参数2.....)

自己指定就可以了

在这个位置,要把参数与存储过程一一对应:
 for(long k = 1; k<cnt; k++)
        {//由于ADO中认为返回值是第一个参数, 因此这里用k=1过滤第一个参数
            m_pCommand->Parameters->GetItem(k)->Value = vtdays; //按存储过程的参数顺序给参数赋值。
        }

#7


/* 填写参数 */
param = cmd->CreateParameter("v_Dybm",adVarNumeric,adParamInput,4,_variant_t( lDybm, VT_I4 )); //地域编码
cmd->Parameters->Append(param);
param = cmd->CreateParameter("v_nMaxNum",adVarNumeric,adParamInput,4,_variant_t( lCallNum, VT_I4 )); //最大选择数
cmd->Parameters->Append(param);
param = cmd->CreateParameter("v_nSelNum",adInteger,adParamOutput,sizeof(int),va); 
cmd->Parameters->Append(param);

/* 执行存储过程 */
cmd->ActiveConnection = CAdoData.pDBConn;
cmd->CommandType      = adCmdStoredProc;
// cmd->CommandText      = _bstr_t("CalloutAssign_PKG.insert_yyljtzb");
cmd->CommandText      = _bstr_t("insert_yyljtzb");

#8


很感谢上述的例子,但是执行该函数时参数的类型并不是_variant_t类型,括号里要怎么写呢?急用,急用

#1


ADO方式执行存储过程,带参数传递,你可以参考下

//执行存储过程。
_RecordsetPtr& ADOConn::ExecuteSP(_bstr_t bstrSQL, _variant_t vtdays)
{
try
{
// 是否已经连接数据库
if(m_pConnection == NULL)
OnInitADOConn();
// Connection对象的Execute方法:(_bstr_t CommandText, 
// VARIANT * RecordsAffected, long Options ) 
// 其中CommandText是命令字串,通常是SQL命令。
// 参数RecordsAffected是操作完成后所影响的行数, 
// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存储过程;adCmdUnknown-未知
m_pCommand.CreateInstance(__uuidof(Command));
m_pRecordset.CreateInstance(__uuidof(Recordset));

m_pCommand->ActiveConnection = m_pConnection;
m_pCommand->CommandText = bstrSQL;//存储过程名
m_pCommand->PutCommandType(adCmdStoredProc);
m_pCommand->Parameters->Refresh();//从数据库查询参数信息
//接下来对每一个参数赋值。
long cnt = m_pCommand->Parameters->GetCount();//取得参数的个数
for(long k = 1; k<cnt; k++)
{//由于ADO中认为返回值是第一个参数, 因此这里用k=1过滤第一个参数
m_pCommand->Parameters->GetItem(k)->Value = vtdays; //按存储过程的参数顺序给参数赋值。
}
//执行这个存储过程
m_pRecordset = m_pCommand->Execute(0,0,adCmdStoredProc);
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
}
return m_pRecordset;
}

#2


代码大概如楼上,对于输出参数,Parameter对象有它的属性标明这是一个输入参数还是输出参数(必须和存储过程的定义一致),这样执行完之后,输出参数就会被赋值给那个Parameter。

#3


也就是说我如果象插入这些不关心输出的存储过程,就可以不需要输出参数,而直接调用上面的存储过程也可以?

#4




我上面调用的存储过程是有参数的,你不管参数就可以了

#5


但是插入要从窗体中获得插入的参数,你上面的给参数赋直还是要要吧?

#6


ExecuteSP(_bstr_t bstrSQL, _variant_t 参数1,_variant_t 参数2.....)

自己指定就可以了

在这个位置,要把参数与存储过程一一对应:
 for(long k = 1; k<cnt; k++)
        {//由于ADO中认为返回值是第一个参数, 因此这里用k=1过滤第一个参数
            m_pCommand->Parameters->GetItem(k)->Value = vtdays; //按存储过程的参数顺序给参数赋值。
        }

#7


/* 填写参数 */
param = cmd->CreateParameter("v_Dybm",adVarNumeric,adParamInput,4,_variant_t( lDybm, VT_I4 )); //地域编码
cmd->Parameters->Append(param);
param = cmd->CreateParameter("v_nMaxNum",adVarNumeric,adParamInput,4,_variant_t( lCallNum, VT_I4 )); //最大选择数
cmd->Parameters->Append(param);
param = cmd->CreateParameter("v_nSelNum",adInteger,adParamOutput,sizeof(int),va); 
cmd->Parameters->Append(param);

/* 执行存储过程 */
cmd->ActiveConnection = CAdoData.pDBConn;
cmd->CommandType      = adCmdStoredProc;
// cmd->CommandText      = _bstr_t("CalloutAssign_PKG.insert_yyljtzb");
cmd->CommandText      = _bstr_t("insert_yyljtzb");

#8


很感谢上述的例子,但是执行该函数时参数的类型并不是_variant_t类型,括号里要怎么写呢?急用,急用