2015-04-17 75 views
4

我可以从蟾蜍sql服务器运行此查询。从JDBC调用Sqlserver存储过程,Java

exec msp_FormBsBa_yeni 0,'20150101','20150131',5000,0,2,0,null,1,null,0 

从我的应用程序在java中,它产生错误,因为语句没有返回结果集。我尝试了很多东西,但我无法解决它。感谢您的帮助。

// Connection,Resultset ve PrepStatement Declaration 
    Connection connection = null; 
    PreparedStatement pstmt = null; 
    ResultSet rsa = null; 
    List<EntCari> listrows = new ArrayList<EntCari>(); 

    try { 
     connection = ConnectionFactory.getConnection(); 

     CallableStatement callableStatement = connection 
       .prepareCall("{call msp_FormBsBa_yeni(0,N'20150101',N'20150131',5000,0,2,0,null,1,null,0)}"); 

     rsa = callableStatement.executeQuery(); 

     // 2:resultset check 
     if (!rsa.next()) { 
      System.out.println("no data"); 
     } else { 
      do { 
       // System.out.println("data exists"); 
       // Statements 
       EntCari row = new EntCari(); 
       row.setMusteriadi(rsa.getString("Unvan"));// rsa.getxxx("column") 
       listrows.add(row); 

      } while (rsa.next()); 
     } 

     // 2--- 

    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally { 
     DbUtil.close(rsa); 
     DbUtil.close(pstmt); 
     DbUtil.close(connection); 
    } 

蟾蜍sql server的结果如下。

Unvan | Ulkesi | VergiKimlikNo | TCKimlikNo | BelgeSayisi | Toplam | CariKod

customer a | 052 | 19697583840 | 1 | 2323,00 | HT00084

customer b | 052 | | 2 | 2111,00 | HT01022

存储过程是像下面(部分SP的,它是长)

/****** Object: Procedure [dbo].[msp_FormBsBa_yeni] Script Date: 18.04.2015 13:43:44 ******/ 
SET ANSI_NULLS ON; 
GO 
SET QUOTED_IDENTIFIER ON; 
GO 
CREATE PROCEDURE dbo.msp_FormBsBa_yeni 
@vFirmaNo as integer, 
@IlkTarih as datetime, 
@SonTarih as datetime, 
@MinTutar as float, 
@Bs_Ba_tip as bit, 
@BirlestimeTuru as tinyint, 
@SonradanMuhasebelesenSeriDahilEdilmesin_fl as bit, 
@SonradanMuhasebelesenSeriStr nvarchar(MAX), 
@Aylik_BsBa_fl as bit, 
@PerakendeCariKodu AS nvarchar(25), 
@EvrakDetayliRapor_fl as bit 
AS 
BEGIN /*dbo.fn_GetByteParam(1048)=1 ÖTV stok maliyetine eklensinmi*/ 
Declare @otv_vergino as tinyint 
set @otv_vergino = dbo.fn_GetByteParam(855) /*ÖTV vergi tipi*/ 
Declare @otv_kdv_orani as FLOAT 
set @otv_kdv_orani = 0.0 
if @otv_vergino between 1 and 10 
set @otv_kdv_orani = dbo.fn_VergiYuzde(@otv_vergino) 
Declare @kontrol_belge_tarihinden as integer 
set @kontrol_belge_tarihinden = dbo.fn_GetByteParam(4173) /*BsBa_Kontrol_Belge_tarihinden_fl*/ 
if exists (select * from tempdb..sysobjects where name LIKE '#BsBaEvrakDetayliTablo%') Drop Table dbo.#BsBaEvrakDetayliTablo 
select 
TABLONO, 
MIN(CHRECNO) AS CHRECNO, 
CARI, 
MAX(TARIH) AS TARIH, 
TIP, 
SERI, 
SIRA, 
MAX(CINS)AS CINS, 
MAX(BELNO)AS BELNO, 
MAX(BELTAR)AS BELTAR... 

,这是将错误信息

com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171) 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:394) 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:340) 
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575) 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:154) 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:283) 

回答

0

下面是实现这两种方式..

String SPsql = "EXEC msp_FormBsBa_yeni ?,?,?"; // for stored proc taking 3 params 
Connection con = SmartPoolFactory.getConnection(); 
PreparedStatement ps = con.prepareStatement(SPsql); 
ps.setEscapeProcessing(true); 
ps.setQueryTimeout(<timeout value>); 
ps.setString(1, "val"); 
ps.setString(2, "val"; 
ps.setString(3, "val"); 
ResultSet rs = ps.executeQuery(); 

或通过使用JDBC景观语法

CallableStatement cStmt = conn.prepareCall("{call msp_FormBsBa_yeni (?, ?, ?) }"); 
cStmt.setString(1, "val"); 
cStmt.setString(2, "val"); 
cStmt.setString(3, "val"); 
cStmt.registerOutParameter(4, Types.INTEGER); // register the output params 
cStmt.registerOutParameter("inOutParam", Types.INTEGER); // or by param name 

以了解详情thisthis

我希望这可以帮助。

+0

我想你提供的第一种方式,遗憾的是同样的结果。该语句不返回结果集 – bmtncy

+0

的第二种方式,它给出了语法错误,因为括号应该在第一个之前?字符,并且正如我所看到的那样,不需要为我的问题使用参数。 – bmtncy

+0

请您分享SP调用的**执行结果**。 –

2

您不能在返回游标/ ResultSet的Transact-SQL CallableStatement上调用executeQuery()。调用该程序的正确方法是这样的:

// You should really use bind variables here... 
CallableStatement call = connection 
    .prepareCall("{call msp_FormBsBa_yeni(?, ?, ?, ...)}"); 
call.setInt(1, ...); 
call.setString(2, ...); 

// This returns true if there are any remaining ResultSets to fetch 
if (call.execute()) { 
    do { 
     try (ResultSet rs = call.getResultSet()) { 
      // Consume the result set here... 
     } 
    } 

    // Move on to the next result set, if any 
    while (call.getMoreResults()); 
} 

如果你想成为完全通用的,你还必须检查Statement.getUpdateCount(),万一有使用结果集,在过程交织更新计数。

1

当我在数据库客户端(例如SQL Server Management Studio)中执行查询时,返回一个表。

我的存储过程很长,有一些插入和更新语句。如果存储过程在最终选择之前执行任何插入或更新,则JDBC(SQL Server驱动程序)与行计数混淆(并且将抛出语句未返回结果集的异常)。幸运的是,修复非常简单:我只需在存储过程开始时添加SET NOCOUNT ON。所以,我的代码是这样:

CREATE PROCEDURE dbo.msp_FormBsBa_yeni 
@vFirmaNo as integer, 
@IlkTarih as datetime, 
@SonTarih as datetime, 
@MinTutar as float, 
@Bs_Ba_tip as bit, 
@BirlestimeTuru as tinyint, 
@SonradanMuhasebelesenSeriDahilEdilmesin_fl as bit, 
@SonradanMuhasebelesenSeriStr nvarchar(MAX), 
@Aylik_BsBa_fl as bit, 
@PerakendeCariKodu AS nvarchar(25), 
@EvrakDetayliRapor_fl as bit 
AS 
BEGIN 
    SET NOCOUNT ON 

我非常感谢你的捐款