1. 程式人生 > >jdbc 呼叫 sql server 的儲存過程時“該語句沒有返回結果集”的解決方法

jdbc 呼叫 sql server 的儲存過程時“該語句沒有返回結果集”的解決方法

在JDBC中呼叫SQL Server中的儲存過程時出現如下異常: 

  1. com.microsoft.sqlserver.jdbc.SQLServerException: 該語句沒有返回結果集。   

  2.         at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)   

  3.         at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:394)   

  4.         at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:340)   

  5.         at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575)   

  6.         at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400)   

  7.         at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179)   

  8.         at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:154)   

  9.         at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:283)

  10. 解決方法,新增下面程式碼

SET NOCOUNT ON
下面是一個儲存過程案例,裡面用到了"臨時表"技術
  1. USE [xngzf]
    GO
    /****** Object:  StoredProcedure [dbo].[PROC_GzfRentMonthZj]    Script Date: 01/03/2014 16:49:50 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER proc [dbo].[PROC_GzfRentMonthZj]
    @fyXqCode varchar(50),
    @fyDhCode varchar(50),
    @affairsMonth varchar(50),
    @lastPerson varchar(50), 
    @lastGov  varchar(50)
    as
    	SET NOCOUNT ON
    	declare @htID varchar(50)
    	declare @chengzfID varchar(50)
    	declare @fyID varchar(50)
    	declare @accountID varchar(50)
    	declare @accountTotal decimal(28, 2)
    	declare @fyzjMonth decimal(28, 2)
    	
    	declare @htCode varchar(50)
    	declare @chengzfName varchar(50)
    	declare @fyName varchar(500)
    	declare @acountTotal decimal(28, 2)
    	declare @resultInfo varchar(500)
    	
    	declare @Num int = 0
    	declare @i int = 1
    
    	/**建立臨時表,返回錯誤資訊**/
    	create  table  Du_ErrorInfo ( 
    	  htCode varchar(50), 
    	  chengzfName  varchar(50),
    	  fyName  varchar(500),
    	  accountID  varchar(50),
    	  accountTotal  decimal(28, 2),
    	  fyzjMonth decimal(28, 2),
    	  resultInfo  varchar(50) DEFAULT '賬戶餘額不足',
    	)
    	
    	/**獲得總數**/
    	set @Num = (select COUNT(*) from tb_xngzf_basic_ht ht
    	left join tb_xngzf_basic_fang fy on ht.fyID = fy.fyID
    	left join tb_xngzf_basic_chengzf czf on ht.chengzfID = czf.zuhuID
    	left join tb_qx_weidu xq on xq.weiduID = fy.fyXqCode	--關聯得到小區名稱
    	left join tb_qx_weidu dh on dh.weiduID = fy.fyDhCode	--關聯得到棟號名稱
    	left join tb_xngzf_basic_ht_child chd on ht.htID = chd.htID
    	where 1=1
    	and ht.isPayMonenty = 2
    	and @affairsMonth between substring(replace(chd.startDate, '-', ''), 0, 7) and substring(replace(chd.endDate, '-', ''), 0, 7)
    	and fy.fyXqCode = @fyXqCode
    	and fy.fyDhCode = @fyDhCode)
    	
    	while( @i<[email protected] )
    	begin
    		/**查詢htID, chengzfID, fyID**/
    		select @htID=fo.htID, @chengzfID=fo.chengzfID, @fyID=fo.fyID, @htCode=fo.htCode, @chengzfName=fo.chengzfName, @fyName=fo.fyName from(
    			select ht.htID, ht.chengzfID, ht.fyID, ROW_NUMBER() over(order by ht.htID) as rowNumber, ht.htCode, czf.zuhuName as chengzfName, xq.weiduName+dh.weiduName+fy.fyFh as fyName from tb_xngzf_basic_ht ht
    			left join tb_xngzf_basic_fang fy on ht.fyID = fy.fyID
    			left join tb_xngzf_basic_chengzf czf on ht.chengzfID = czf.zuhuID
    			left join tb_qx_weidu xq on xq.weiduID = fy.fyXqCode	--關聯得到小區名稱
    			left join tb_qx_weidu dh on dh.weiduID = fy.fyDhCode	--關聯得到棟號名稱
    			left join tb_xngzf_basic_ht_child chd on ht.htID = chd.htID
    			where 1=1
    			and ht.isPayMonenty = 2
    			and @affairsMonth between substring(replace(chd.startDate, '-', ''), 0, 7) and substring(replace(chd.endDate, '-', ''), 0, 7)
    			and fy.fyXqCode = @fyXqCode
    			and fy.fyDhCode = @fyDhCode
    		)fo
    		where fo.rowNumber = @i		
    		begin
    		/**判斷扣租表裡該月份是否已扣租**/
    		if( not exists(select * from tb_xngzf_basic_money_deduct where [email protected] and affairsMonth=replace(@affairsMonth, '-', '')) )
    			begin 
    				/**查詢accountID**/
    				if(@chengzfID is not null)
    				begin
    					select @accountID=accountID from tb_xngzf_basic_money_account where chengzfID = @chengzfID
    				end
    				set @accountTotal = (select accountTotal from tb_xngzf_basic_money_account where accountID = @accountID)
    				set @fyzjMonth = (select fyZujinMonth from tb_xngzf_basic_ht_child where htID = @htID)
    				--set @accountTotal = 50
    				--set @fyzjMonth = 100
    				if(@accountTotal>[email protected])
    				begin
    					begin tran
    					--print @htID + ',' + @chengzfID + ',' + @fyID
    					/**更新賬戶表的賬戶金額**/
    					update tb_xngzf_basic_money_account set [email protected], [email protected] where [email protected]
    					if @@ERROR <> 0
    					begin 
    						rollback tran
    					end
    					/**插入賬戶子表一條扣費記錄**/
    					insert into tb_xngzf_basic_money_account_child(feeID, accountID, chengzfID, szType, income, expenses, accountTotal, scDesc, lastTime, lastPerson, lastGov)
    					values((select MAX(CONVERT(bigint, feeID)+1) from tb_xngzf_basic_money_account_child), @accountID, @chengzfID, 4, 0, @fyzjMonth, @[email protected], '日常扣租', (select convert(nvarchar,getdate(),23)), @lastPerson, @lastGov)
    					if @@ERROR <> 0
    					begin 
    						rollback tran
    					end
    					/**插入扣租表一條扣租記錄**/
    					insert into tb_xngzf_basic_money_deduct(kfID, htID, fyID, chengzfID, affairsMonth, sfMoney, sfDesc, lastTime, lastPerson, lastGov)
    					values((select MAX(CONVERT(bigint, kfID)+1) from tb_xngzf_basic_money_deduct), @htID, @fyID, @chengzfID, replace(@affairsMonth, '-', ''), @fyzjMonth, '來自扣租', (select convert(nvarchar,getdate(),23)), @lastPerson, @lastGov)
    					if @@ERROR <> 0
    					begin 
    						rollback tran
    					end
    					commit tran
    				end
    				else
    				begin	
    					--插入臨時表一條記錄
    					insert into Du_ErrorInfo(htCode, chengzfName, fyName, accountID, accountTotal, fyzjMonth, resultInfo)
    					values(@htCode, @chengzfName, @fyName, @accountID, @accountTotal, @fyzjMonth, '賬戶餘額不足')
    				end
    			end
    			set @[email protected]+1
    		end
    	end
    	--查詢臨時表記錄
    	select due.htCode, due.chengzfName, due.fyName, due.accountID, due.accountTotal, due.fyzjMonth, due.resultInfo from Du_ErrorInfo due
    	--刪除臨時表
    	drop table Du_ErrorInfo
    	
    	--調儲存過程
    	exec PROC_GzfRentMonthZj  '77', '78', '2014-06', '1', ''


相關推薦

jdbc 呼叫 sql server儲存過程語句沒有返回結果”的解決方法

在JDBC中呼叫SQL Server中的儲存過程時出現如下異常:  com.microsoft.sqlserver.jdbc.SQLServerException: 該語句沒有返回結果集。            at com.microsoft.sqlserver

Yii2.0呼叫sql server儲存過程並獲取返回

1、首先展示建立sql server儲存過程的語句,建立一個簡單的儲存過程,測試用。 1 SET ANSI_NULLS ON 2 GO 3 SET QUOTED_IDENTIFIER ON 4 GO 5 6 CREATE PROCEDURE [dbo].[register_info]

Excel使用ADO呼叫SQL Server儲存過程

測試環境:SQL Server 2014,Excel 2013前期在做一個現場投票的小軟體,準備使用Excel實現,工作簿中包含有兩個工作表,各包含一個命令按鈕,分別用於提交和檢視投票結果。問題出在檢視投票按鈕上,起初只是使用SELECT語句查詢,一切正常;後期對於投票結果需

oracle儲存過程傳入in引數,返回結果

create or replace procedure proc_report_TEST(zhxshss in varchar2, pcursor out sys_refcursor) as begi

SQL Server儲存過程中top後為變數的處理

@pageRecordNum為每頁顯示的記錄數,@currentPageNum為當前的頁數 create proc pagination  @pageRecordNum int,@currentPageNum int as  declare @recNum varchar(

Sql Server 儲存過程呼叫儲存過程接收輸出引數,返回

CREATE PROCEDURE [dbo].[GetCustomers]   (@rowcount INT OUTPUT)   AS        SELECT [CustomerID]         ,[CompanyName]         ,[ContactName]         ,[

sql server儲存過程迴圈呼叫

ALTER PROCEDURE [dbo].[OMS_DISCOUNT_SHARING_PRO]   @lypt AS VARCHAR(10)  AS DECLARE @orderStatus VARCHAR(10); DECLARE @orderlypt VARCHAR(

SQL Server 儲存過程中處理多個查詢條件的幾種常見寫法分析,我們用那種寫法

最近發現還有不少做開發的小夥伴,在寫儲存過程的時候,在參考已有的不同的寫法時,往往很迷茫, 不知道各種寫法孰優孰劣,該選用那種寫法,以及各種寫法優缺點,本文以一個簡單的查詢儲存過程為例,簡單說一下各種寫法的區別,以及該用那種寫法 專業DBA以及熟悉資料庫的同學請無視。

SQL server 儲存過程的編寫

USE [資料庫名稱] GO /****** Object:  StoredProcedure [dbo].[insertbGait]    Script Date: 2018/7/17 15:51:22 ******/ SET ANSI_NULLS ON GO

SQL SERVER儲存過程加密和安全上下文

對SQL Server 2008的安全入門略作小結,以作備忘。本文涉及兩個應用:儲存過程加密和安全上下文。 <一>儲存過程加密 SQL server,我已經成了儲存過程的忠實擁躉。在直接使用SQL語句還是儲存過程來處理業務邏輯時,我基本會毫不猶豫地選擇後者。 理由如下:

SQL Server 儲存過程返回值的幾種方式

獲得儲存過程的返回值–通過查詢分析器獲得 (1)不帶任何引數的儲存過程(儲存過程語句中含有return) —建立儲存過程 CREATE PROCEDURE testReturn AS return 145 GO —執行儲存過程 DECLARE @RC int exec @RC=

SQL Server儲存過程的使用

   儲存過程概述   簡單來說,儲存過程就是一條或者多條sql語句的集合,可視為批處理檔案,但是其作用不僅限於批處理。  基本概念:   SQL Server中的儲存過程是使用T_SQL編寫的程式碼段。它的目的在於能夠方便的從系統表中查詢資訊,   或者完成與更新資料

SQL Server 儲存過程返回值彙總

獲得儲存過程的返回值–通過查詢分析器獲得 (1)不帶任何引數的儲存過程(儲存過程語句中含有return) —建立儲存過程 CREATE PROCEDURE testReturn AS return 145 GO —執行儲存過程 DECLARE @RC in

Sql Server 儲存過程 - 使用者操作例項

使用者的增刪改查 新增 --新增使用者 create procedure addDeviceUser @name nvarchar(36) , @phone nvarchar(36) , @password nvarchar(255) as begin if exists(

Sql server 儲存過程

-- ======================================= -- Author: <zengyongbin> -- Create date: <2018-11-11> -- Description: <新增> --

關於SQL SERVER 儲存過程使用(2)

  現在有一場景,需要調用出公司員工在本週的請假天數。程式碼如下(1),本人一開始寫的時候用遍歷裡面套著一個遍歷,發現效果出不來如下(2),求是否有什麼方法可以實現遍歷裡面還有個遍歷。 SQL程式碼(1): --建立儲存過程 create procedure LeaveT

無意中發現的sql server 儲存過程加密破解方法

轉自:https://blog.csdn.net/gatr/article/details/51226122  儲存過程是資料庫中一個非常重要的該部分,很多業務邏輯都可能寫在儲存過程裡面,為了安全,部分儲存過程是加密存放的,如果我們想看到原始碼,就非常困難了,在sql  se

SQL SERVER儲存過程批量插入資料庫表資料

CREATEPROCEDURE add_UserInfoASDECLARE@userCodeVARCHAR(30)DECLARE@userNameVARCHAR(30)DECLARE@userCode_baseVARCHAR(30)DECLARE@countINTEGERDECLARE@indexINTEGE

SQL server 儲存過程的建立並使用

什麼是儲存過程呢? 儲存過程就是作為可執行物件存放在資料庫中的一個或多個SQL命令。  通俗來講:儲存過程其實就是能完成一定操作的一組SQL語句。 那為什麼要用儲存過程呢? 1.儲存過程只在創造時進行編譯,以後每次執行儲存過程都不需再重新編譯,而一般SQL語句每執行一

Sql Server儲存過程從一個表中抓取資料填充到另一張表中

  set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Author:  <alex,,Name> -- Create