如何用MFC调用存储过程

青稞 2010-02-02 12:27:46
我用VS2008的MFC,通过ADO访问SQL2005数据库,
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;
HRESULT hResult;
hResult = m_pConnection.CreateInstance(__uuidof(Connection));
if (SUCCEEDED(hResult))
{
m_pConnection->ConnectionTimeout = 5;///设置超时时间为5秒

hResult = m_pConnection->Open((_bstr_t)"Driver={SQL Server};Server=192.168.3.222,81\\SQLEXPRESS;Database=GovSysCheck;UID=GovCheck2;PWD=123456","","",adModeUnknown);
}

接下来想调用这样一个存储过程:
DECLARE @id as int;
exec @id=spAddtbRepository(?,?,?,?)//这个数据库那边写好了,我只要传参数进去就好了..
select @id as id
主要是取得ID..
我怎么样调用这个存储过程..
...全文
343 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
青稞 2010-02-03
  • 打赏
  • 举报
回复
有人回答么??谢谢??
青稞 2010-02-03
  • 打赏
  • 举报
回复
谢谢楼上的答复,我在研究,但我想知道我上面的代码出了什么问题呢??
青稞 2010-02-03
  • 打赏
  • 举报
回复
有人知道么??指点下..在线等..急用!
  • 打赏
  • 举报
回复
mark
青稞 2010-02-03
  • 打赏
  • 举报
回复
存储过程是以下的:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[spAddtbRepository]--插入知识库信息
@RepositoryID numeric OUT, --知识点ID
@RepositoryCategoryID numeric, --类型编号
@RepositoryForRevisionyID numeric, --知识库版本ID
@ParentRepositoryID numeric, --上级ID
@Level int, --1级最高,依次递增
@SerialNumber int, --在同一父ID下的序号
@ShortText nvarchar(256), --内容简写
@FullText nvarchar(2048), --内容
@Hint nvarchar(2048), --提示信息,第二版新增,满足用户需求
@Remark nvarchar, --备注 在用户完成时,如果未完成该项,则提示警告用户完成该项
@QuestionOrAnswer int, --问题答案1:问题;2:答案;3:问题答案兼有
@Symbol nvarchar(256), --标识符
@LastVersionRepositoryID numeric --上一个版本对应ID

AS
DECLARE @ret AS INT;
BEGIN
SET NOCOUNT ON
SET @ret = 0;
BEGIN TRY
INSERT INTO tbRepository(RepositoryCategoryID, RepositoryForRevisionyID,
ParentRepositoryID, [Level], SerialNumber, ShortText, [FullText], Hint, Remark,
QuestionOrAnswer, Symbol, LastVersionRepositoryID)
VALUES(@RepositoryCategoryID, @RepositoryForRevisionyID,
@ParentRepositoryID, @Level, @SerialNumber, @ShortText, @FullText, @Hint, @Remark,
@QuestionOrAnswer, @Symbol, @LastVersionRepositoryID)
SELECT @ret = @@IDENTITY
END TRY
BEGIN CATCH
SET @ret = 0;
END CATCH

SET @RepositoryID = @ret;
RETURN @ret;
END


VC里面我这样写的:
m_pCommand->CommandText = _bstr_t("spAddtbRepository");
m_pCommand->CommandType = adCmdStoredProc;
m_pCommand->Parameters->Refresh();

int iRet = 0;
_ParameterPtr pParaReturnID;
pParaReturnID = m_pCommand->CreateParameter( _bstr_t("@ret"), adInteger, adParamReturnValue, sizeof(int), iRet);
m_pCommand->Parameters->Append(pParaReturnID);

_ParameterPtr pParaID;
pParaID = m_pCommand->CreateParameter( _bstr_t("@RepositoryID"), adNumeric, adParamOutput, sizeof(int), treeNode->iID);
m_pCommand->Parameters->Append(pParaID);

_ParameterPtr pParaCategoryID;
pParaCategoryID = m_pCommand->CreateParameter( _bstr_t("@RepositoryCategoryID"), adNumeric, adParamInput, sizeof(int), treeNode->iType);
m_pCommand->Parameters->Append(pParaCategoryID);

_ParameterPtr pParaRevisionyID;
pParaRevisionyID = m_pCommand->CreateParameter( _bstr_t("@RepositoryForRevisionyID"), adNumeric, adParamInput, sizeof(int), treeNode->iVersionID);
m_pCommand->Parameters->Append(pParaRevisionyID);

_ParameterPtr pParaParentRepositoryID;
pParaParentRepositoryID = m_pCommand->CreateParameter( _bstr_t("@ParentRepositoryID"), adNumeric, adParamInput, sizeof(int), treeNode->iParentID);
m_pCommand->Parameters->Append(pParaParentRepositoryID);

_ParameterPtr pParaLevel;
pParaLevel = m_pCommand->CreateParameter( _bstr_t("@Level"), adInteger, adParamInput, sizeof(int), treeNode->iLayID);
m_pCommand->Parameters->Append(pParaLevel);

_ParameterPtr pParaSerialNumber;
pParaSerialNumber = m_pCommand->CreateParameter( _bstr_t("@SerialNumber"), adInteger, adParamInput, sizeof(int), treeNode->iSortNO);
m_pCommand->Parameters->Append(pParaSerialNumber);

_ParameterPtr pParaShortText;
pParaShortText = m_pCommand->CreateParameter( _bstr_t("@ShortText"), adWChar, adParamInput, 128, _variant_t(treeNode->szSContents));
m_pCommand->Parameters->Append(pParaShortText);

_ParameterPtr pParaFullText;
pParaFullText = m_pCommand->CreateParameter( _bstr_t("@FullText"), adWChar, adParamInput, 128, _variant_t(treeNode->szContents));
m_pCommand->Parameters->Append(pParaFullText);

_ParameterPtr pParaHint;
pParaHint = m_pCommand->CreateParameter( _bstr_t("@Hint"), adWChar, adParamInput, 128, _variant_t(treeNode->szTipContents));
m_pCommand->Parameters->Append(pParaHint);

_ParameterPtr pParaRemark;
pParaRemark = m_pCommand->CreateParameter( _bstr_t("@Remark"), adWChar, adParamInput, 1, NULL);
m_pCommand->Parameters->Append(pParaRemark);

_ParameterPtr pParaQuestionOrAnswer;
pParaQuestionOrAnswer = m_pCommand->CreateParameter( _bstr_t("@QuestionOrAnswer"), adInteger, adParamInput, sizeof(int), 1);
m_pCommand->Parameters->Append(pParaQuestionOrAnswer);

_ParameterPtr pParaSymbol;
pParaSymbol = m_pCommand->CreateParameter( _bstr_t("@Symbol"), adWChar, adParamInput, 128, NULL);
m_pCommand->Parameters->Append(pParaSymbol);

_ParameterPtr pParaLastVersionRepositoryID;
pParaLastVersionRepositoryID = m_pCommand->CreateParameter( _bstr_t("@LastVersionRepositoryID"), adNumeric, adParamInput, sizeof(int), 1);
m_pCommand->Parameters->Append(pParaLastVersionRepositoryID);

m_pCommand->Execute(NULL, NULL, adCmdStoredProc);//总是报"多步OLEDB操作产生错误",请问是怎么回事呢??
lyserver 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fighttodeath 的回复:]
回来了..呵呵..
请问如何向数据库中插入一条数据,然后我就能马上获得这条数据的ID呢?(这个ID是自增长的..)
[/Quote]
可以在存储过程里实现。
INSERT INTO 表名 (字段列表) VALUES (值列表)
//以记录集方式返回ID
SELECT MAX(ID) FROM 表名
//以RETURN参数形式返回ID
SELECT nID=MAX(ID) FROM 表名
RETURN nID
//定义一个OUTPUT类型的参数,以OUTPUT参数形式返回ID
SELECT outputID = MAX(ID) FROM 表名
lyserver 2010-02-02
  • 打赏
  • 举报
回复
使用Parameter对象或者VARIANT类型的SAFEARRAY。
marrco2005 2010-02-02
  • 打赏
  • 举报
回复


_CommandPtr spCommand;


spCommand.CreateInstance( __uuidof( Command ) );
spCommand->ActiveConnection = m_pConnection;
spCommand->CommandText = _bstr_t("spAddtbRepository");
spCommand->CommandType = adCmdStoredProc;

// 下面的代码是创建存储过程的参数
// 根据你的实际情况进行修改
_ParameterPtr spParam;
spParam = spCommand->CreateParameter( _bstr_t("@param1"), ADODB::adLongVarChar, ADODB::adParamInput, strProgramCode.GetLength() + 1);
BSTR bstr = strProgramCode.AllocSysString();
spParam->Value = _variant_t( bstr );
::SysFreeString(bstr);
spCommand->Parameters->Append( spParam );
//
_ParameterPtr spParam1;
spParam1 = spCommand->CreateParameter( _bstr_t("@param2"), ADODB::adLongVarChar, ADODB::adParamInput, strChnID.GetLength() + 1);
bstr = strChnID.AllocSysString();
spParam1->Value = _variant_t( bstr );
::SysFreeString(bstr);
spCommand->Parameters->Append( spParam1 );

// 执行存储过程
_RecordsetPtr pRet = spCommand->Execute( NULL, NULL, adCmdStoredProc );
青稞 2010-02-02
  • 打赏
  • 举报
回复
回来了..呵呵..
请问如何向数据库中插入一条数据,然后我就能马上获得这条数据的ID呢?(这个ID是自增长的..)
青稞 2010-02-02
  • 打赏
  • 举报
回复
_variant_t vtEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
_variant_t vtEmpty2(DISP_E_PARAMNOTFOUND, VT_ERROR);

m_pCommand->CommandText = _bstr_t("spAddtbRepository");
m_pCommand->CommandType = adCmdStoredProc;

_ParameterPtr pParaID;
pParaID = m_pCommand->CreateParameter( _bstr_t("@RepositoryID"), adNumeric, adParamOutput, sizeof(int));
pParaID->Value = _variant_t( treeNode->iID );
m_pCommand->Parameters->Append(pParaID);
//
_ParameterPtr pParaCategoryID;
pParaCategoryID = m_pCommand->CreateParameter( _bstr_t("@RepositoryCategoryID"), adNumeric, adParamInput, sizeof(int));
pParaCategoryID->Value = _variant_t(treeNode->iType);
m_pCommand->Parameters->Append(pParaCategoryID);

_ParameterPtr pParaFullText;
pParaFullText = m_pCommand->CreateParameter( _bstr_t("@FullText"), adLongVarWChar, adParamInput, 256);
pParaFullText->Value = _variant_t(treeNode->szContents);
m_pCommand->Parameters->Append(pParaFullText);

m_pRecordset= m_pCommand->Execute( &vtEmpty, &vtEmpty2, adCmdStoredProc );//运行到这里直接爆掉..
青稞 2010-02-02
  • 打赏
  • 举报
回复
执行这个后spAddtbRepository,怎么取得添加记录的ID呢?(这个ID是数据库自增长的)
其实spAddtbRepository主要是insert语句的,我想insert后,取得这条ID。
ls2141 2010-02-02
  • 打赏
  • 举报
回复
。。路过 学习

16,471

社区成员

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

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

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