qt调用sql server存储过程并获取output参数

最近新做的一个项目需要使用qt连接另一台机器上的sql server,虽然网上已有类似文章,但还是有些其中很少提及的问题,故在这里汇总下:

  qt连接sql server可以参考这篇文章,如果是连接另一台机器的sql server就不用执行第一步“开启ODBC驱动”了

http://www.cnblogs.com/shaolw/p/3411285.html

另外指定数据库用户名和密码可以使用Uid和Pwd,即原文dsn参数可以这样写:

QString dsn = QString("Driver={SQL Server};Server=%1;Database=%2;Uid=%3;Pwd=%4").arg(serverName).arg(dbName).arg(userName).arg(password);

而且“Trusted_Connection=yes”也要删除,否则会报错。

  关于如何调用存储过程可以参考如下文章:

http://blog.chinaunix.net/uid-13830775-id-216429.html

其中QSqlQuery::prepare()的参数怎么写,其实只要在SQL Server Management Studio中先调用下存储过程就会自动生成调用代码,EXEC那部分再精简下即可直接使用了。

推荐使用Oracle格式占位符即冒号方式如:argname,相比ODBC格式的?占位符方便很多。另外如果是多个output参数,可以用这样写:

query.prepare("exec PINSERTPC :arg1 output, :arg2 output");

最后还有一个需要注意的地方,sql server需要在所有结果集都被遍历后才能通过query.boundValue获取output参数的值,未遍历前获取的其实仍是query.bindValue时的默认值,具体可以参见bool QSqlQuery::nextResult()的介绍:

Note that some databases, i.e. Microsoft SQL Server, requires non-scrollable cursors when working with multiple result sets. Some databases may execute all statements at once while others may delay the execution until the result set is actually accessed, and some databases may have restrictions on which statements are allowed to be used in a SQL batch.

时间: 2024-08-08 05:37:59

qt调用sql server存储过程并获取output参数的相关文章

Cpp 调用sql server 存储过程时不返回output参数解决办法

Cpp 调用sql server 存储过程时不返回output参数,但是在ssms中调用的时候能正常返回,貌似数据库和应用代码是一切正常,再测试用c#调用也能正常获取output参数,在存储过程的的开始加上set nocount on,就能解决这个问题. 墙外原文件:点击打开链接

VS中调用SQL SERVER存储过程

 存储过程是经过编译的,永久保存在数据中的一组SQL语句,通过创建和使用存储过程可以提高程序的重用性和扩展性,为程序提供模块化的功能,还有利于对程序的维护和管理.下面就详谈一下,VB.NET如何调用SQL SERVER中的存储过程. 以上就是本人数据库中的一张表-OnDutyInfo 创建存储过程 <span style="font-size:18px;">create procedure pro_OnDutyInfo --存储过程名 @teacherID char(1

java 调用 sql server存储过程

Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储过程在创建时即在数据库服务器上进

c#客户端调用sql server 存储过程速度慢的问题

1 : c#代码是 SqlConnection connNew = null; connNew = new SqlConnection(@"Data Source="XXX"); connNew.Open(); SqlCommand commNew = connNew.CreateCommand(); commNew.CommandText = "sp_catcher_MeraRptCAV_Insert_detail"; commNew.CommandTy

Java调用SQL Server存储过程

1.调用普通存储过程(1)创建存储过程CREATE Procedure [dbo].[GetContactListByName]  /*根据联系人姓名获取联系人信息*/@Name nvarchar(50)Asbegin    select Contact.Id,Contact.Name,Phone,Email,QQ,GroupName from Contact,ContactGroup where Contact.GroupId=ContactGroup.Id and Name like '%'

laravel调用sql server存储过程

alter proc [dbo].[aaa](    @AgencyID int,--代理商ID    @AdminID int --结算操作人ID(管理员ID))asbegin    select top 5 * from tusers    return 5end $dbh = DB::connection()->getPdo(); $stmt = $dbh->prepare("EXEC aaa ?,?");//Web_pAgencyBalance_Single $a

SQL Server 储存过程的output 参数

要做的参数的回传一方面要做到有储存过程的配合,再一方面也要有调用方法的配合,也就是说错误的调用方法是没有办法把值回传的. 下面是例子 --1.储存过程方面的配合 create procedure dbo.usp_C @i as int output    ---**注意这里要用output 关键字**--- as begine set @i =100; end; -- 2.调用方面的配合 declare @j as int =1; exec dbo.usp_C @j output ;--**注意

SQL SERVER 存储过程执行带输出参数的SQL语句拼接

注意:定义的要执行的SQL语句必须是nvarchar类型 CREATE PROC P_BranchOrderSalesStatistics @beginTime DateTime, --开始时间 @endTime DateTime, --结束时间 @branchCode varchar(20), --门店编码 @NewMemberCount int out, -- 新会员数量 @OrderCount int out, --订单数量 @SalesTotalPrice decimal(18,2) o

SQL Server存储过程和游标有关实例以及相关网址

内含游标的存储过程实例 第一种写法 GO BEGIN IF (object_id('PT_FAULT_REPORT', 'P') is not null) drop proc PT_FAULT_REPORT; END GO CREATE PROCEDURE PT_FAULT_REPORT (@index int, @stop_time DATETIME, @start_time DATETIME) AS DECLARE @departmentindex int, @departmentname