求C++调用SQL server 2008存储过程

Andrewdavid 2016-09-01 10:30:56
各位老师,我新学C++,C++是不是不适合与数据库交互,
我在网上扒了一天,还是没有搞定C++调用存储过程的demo
ALTER PROCEDURE [dbo].[forbid]
@xm varchar(50),
@id int output,
@mc varchar(150) output
AS
BEGIN
SET NOCOUNT ON;
select @id=id, @mc=mc from bmxx where xm=@xm and zt=1
update bmxx set zt=0 where xm=@xm and zt=1
return
END
求一个能调用以上存储过程的例子学习,不用MFC,纯C++版!
...全文
367 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiqiang01234 2016-09-05
  • 打赏
  • 举报
回复
引用 13 楼 ss18618 的回复:
[quote=引用 11 楼 zhao4zhong1 的回复:] https://technet.microsoft.com/zh-cn/library/ms403314(v=sql.110) http://download.csdn.net/detail/xiuli520/3331733 http://bbs.csdn.net/topics/70285212
我花了两天多,还是没有搞定,用C#我一下午就调了两个不同的存储过程 怎么C++这么难啊?[/quote] 因为c++不属于微软,而c#和ado都是微软的
赵4老师 2016-09-05
  • 打赏
  • 举报
回复
在MSDN里面搜“COM Tutorial Samples”
Andrewdavid 2016-09-05
  • 打赏
  • 举报
回复
引用 12 楼 yuelengdihai 的回复:
参考
DLL里面是不是不能用ADO调用存储过程
pengyao1207000001 2016-09-05
  • 打赏
  • 举报
回复
不好意思 是这个: http://bbs.csdn.net/topics/392006292
Andrewdavid 2016-09-05
  • 打赏
  • 举报
回复
引用 14 楼 baidu_30174103 的回复:
是要用C++读取数据库吗? 可以看看这个例子http://bbs.csdn.net/topics/392013025
这个链接就是本帖啊
pengyao1207000001 2016-09-05
  • 打赏
  • 举报
回复
是要用C++读取数据库吗? 可以看看这个例子http://bbs.csdn.net/topics/392013025
Andrewdavid 2016-09-05
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
https://technet.microsoft.com/zh-cn/library/ms403314(v=sql.110) http://download.csdn.net/detail/xiuli520/3331733 http://bbs.csdn.net/topics/70285212
我花了两天多,还是没有搞定,用C#我一下午就调了两个不同的存储过程 怎么C++这么难啊?
赵4老师 2016-09-05
  • 打赏
  • 举报
回复
赵4老师 2016-09-05
  • 打赏
  • 举报
回复
在COM编程时,请杜绝使用string
Andrewdavid 2016-09-05
  • 打赏
  • 举报
回复
引用 21 楼 zhao4zhong1 的回复:
c_str()和楼主的八字犯冲! 字符串那些事儿:BSTR-LPSTR-LPWSTR-CString-VARIANT-COleVariant-_variant_t-CComBSTR-_bstr_t http://blog.csdn.net/pizi0475/archive/2010/03/04/5346708.aspx
m_pCmd->Parameters->Append(m_pParam); m_pParam = m_pCmd->CreateParameter(_bstr_t("@tb"), adVarChar, adParamOutput,30); m_pCmd->Parameters->Append(m_pParam); m_pCmd->Execute(NULL, NULL, adCmdStoredProc); tb = m_pCmd->Parameters->GetItem("@tb")->GetValue(); m_pCmd.Detach(); } catch (_com_error e)//捕捉异常 { cerr << "\nERROR:" << (char*)e.Description();//抛出异常 } if (m_pConnection->State) { m_pConnection->Close(); } ::CoUninitialize(); system("pause"); cout <<tb.c_str()<< endl; cin >> i; return 0; 老师,是在/抛出异常的地方出现的错误提示,应该 和c_str()没啥关系吧!
赵4老师 2016-09-05
  • 打赏
  • 举报
回复
c_str()和楼主的八字犯冲! 字符串那些事儿:BSTR-LPSTR-LPWSTR-CString-VARIANT-COleVariant-_variant_t-CComBSTR-_bstr_t http://blog.csdn.net/pizi0475/archive/2010/03/04/5346708.aspx
Andrewdavid 2016-09-05
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong1 的回复:
在MSDN里面搜“COM Tutorial Samples”
总算弄好,谢谢老师,但是返回参数只能返回整形,字符串型的返回断点总是说类型不匹配: string tb; m_pParam = m_pCmd->CreateParameter("@tb", adChar, adParamOutput,30); cout <<tb.c_str()<< endl; 如果是: int tb; m_pParam = m_pCmd->CreateParameter("@tb", adInteger, adParamOutput,sizeof(int),30); 就没有问题??
Andrewdavid 2016-09-02
  • 打赏
  • 举报
回复
引用 7 楼 lianshaohua 的回复:
[quote=引用 5 楼 ss18618 的回复:] [quote=引用 4 楼 lianshaohua 的回复:] 使用ado来访问数据吧,为了省事基本都会选择这么做;就像你如果要访问mysql数据库使用mysql提供的接口库一样的道理
网上有个帖子说ado不能进行insert和update等修改数据的动作[/quote] 看看ado的相关接口,怎么可能不能[/quote] 求一个完整的例子学习一下
ztenv 版主 2016-09-02
  • 打赏
  • 举报
回复
引用 5 楼 ss18618 的回复:
[quote=引用 4 楼 lianshaohua 的回复:] 使用ado来访问数据吧,为了省事基本都会选择这么做;就像你如果要访问mysql数据库使用mysql提供的接口库一样的道理
网上有个帖子说ado不能进行insert和update等修改数据的动作[/quote] 看看ado的相关接口,怎么可能不能
jiqiang01234 2016-09-02
  • 打赏
  • 举报
回复
引用 5 楼 ss18618 的回复:
[quote=引用 4 楼 lianshaohua 的回复:] 使用ado来访问数据吧,为了省事基本都会选择这么做;就像你如果要访问mysql数据库使用mysql提供的接口库一样的道理
网上有个帖子说ado不能进行insert和update等修改数据的动作[/quote] 胡扯。直接用sql语句,什么都能操作
Andrewdavid 2016-09-02
  • 打赏
  • 举报
回复
引用 4 楼 lianshaohua 的回复:
使用ado来访问数据吧,为了省事基本都会选择这么做;就像你如果要访问mysql数据库使用mysql提供的接口库一样的道理
网上有个帖子说ado不能进行insert和update等修改数据的动作
ztenv 版主 2016-09-02
  • 打赏
  • 举报
回复
使用ado来访问数据吧,为了省事基本都会选择这么做;就像你如果要访问mysql数据库使用mysql提供的接口库一样的道理
jiqiang01234 2016-09-02
  • 打赏
  • 举报
回复
把ADO封装一下,做个简易的dll。然后就可以在c/c++中使用了

#ifndef _ADO_SQL_H_
#define _ADO_SQL_H_

#ifndef ADO_API
	#ifdef __cplusplus
		#define ADO_API extern "C" __declspec(dllimport)	
	#else
		#define ADO_API __declspec(dllimport)	
	#endif
#else
	#undef ADO_API
	#ifdef __cplusplus
		#define ADO_API extern "C" __declspec(dllexport)	
	#else
		#define ADO_API __declspec(dllexport)	
	#endif	
#endif

#ifndef STDCALL
#define STDCALL __stdcall 
#endif

#ifndef Bool
#define Bool int
#endif

#ifndef True
#define True 1
#endif

#ifndef False
#define False 0
#endif



struct ADOConn;

#define ADO_FIELD_NAME_LEN		64
#define ADO_FIELD_VALUE_LEN		(8 * 1024)
struct ADOFieldInfo
{
	char name[ADO_FIELD_NAME_LEN];
	char value[ADO_FIELD_VALUE_LEN];
};

typedef void (STDCALL* ADOQueryCallback)(const struct ADOFieldInfo* info, int fieldCount, void* user);

ADO_API Bool STDCALL ADO_Initialize(); 
ADO_API void STDCALL ADO_Uninitialize();


ADO_API struct ADOConn* STDCALL ADO_CreateConnection(const char* connString);
ADO_API void STDCALL ADO_DestroyConnection(struct ADOConn* conn);

ADO_API Bool STDCALL ADO_Exec(struct ADOConn* conn, const char* sql);
ADO_API void STDCALL ADO_Query(struct ADOConn* conn, const char* sql, ADOQueryCallback cb, void* user);

#endif
列子汤问 2016-09-02
  • 打赏
  • 举报
回复
一般来说,从SQL Server提供的接口来说, 要访问存储过程,需要使用ADODB.Command等对象,纯粹的C/C++很难直接使用这些COM对象。 可以查看SQL Server是否提供标准的API 接口(好像没有)。 或者可以在MFC中剥离其他库,最小化的使用SQL Server提供的COM对象库。
加载更多回复(3)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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