使用带有null ResultSet的JDBC的临时表

我正在使用MS SQL驱动程序版本3.0通过标准JDBC连接执行存储过程。

我发现当我创建数据并将其插入临时表时,存储过程无法正常执行。

Java代码不会抛出exception,但javax.sql.ResultSet将为null

存储过程中的失败点是我取消注释INSERT INTO #TBL CLM_NAME VALUES('VAL')

当我使用SQL Studio Manager执行语句时,它可以毫无困难地执行,并且数据按预期执行。

有没有人遇到这个或知道为什么会这样?

最初我认为它是因为SQL驱动程序,我仍然认为它是?

谢谢。

也许这会有所帮助 :

建议如果要使用临时表,则不应调用“prepareStatement”。 您可以直接从语句对象执行查询。

例如:

 String sql = "select uuid, name from Component"; Statement stmt = dbCon.createStatement(); ResultSet rs = stmt.executeQuery(sql); 

如果必须调用“prepareStatement”,则需要创建一个真实的表,如果需要,然后删除该表。

executeQuery()旨在与返回ResultSet的查询一起使用,通常是SELECT语句。

executeUpdate()用于返回更新计数的INSERT,UPDATE,DELETE或DDL语句。

JDBC将上述两个(ResultSet和更新计数)视为“结果”。 对于返回多个结果的查询,它需要我们调用execute()。

如果存储过程使用临时表,则可能首先返回更新计数,然后返回ResultSet。 您应该使用execute()来运行查询,调用getMoreResults()来跳过更新计数,然后调用getResultSet()来获取所需的ResultSet 。 这里的问题是我们必须通过多次调用getMoreResults()来通过调用getResultSet()获取我们想要的结果集来进行反复试验。

您可以通过指定“ SET NOCOUNT ON ”来抑制所有额外的“查询结果”,而不是上面的反复试验。

需要更改,

  1. 把你的逻辑放在SP“SPCHILD”中。 此存储过程将具有逻辑以及临时表创建。

  2. 创建一个SP“SPPARENT”,如下所示,

      CREATE PROCEDURE [dbo].[SPPARENT] @Id int = NULL AS BEGIN SET NOCOUNT ON; EXEC(' SPCHILD @Id = ' + @Id) END 

    从父SP“SPPARENT”您必须调用您的实际SP即“SPCHILD”。

  3. 从您的JDBC代码中进行SP调用“SPPARENT”。

我也面临同样的问题。 为了解决这个问题,我将在我的sql server上设置跟踪,并在执行实际SP调用之前查看MS JDBC驱动程序正在执行的所有语句。 这应该有助于我清理一切。 不幸的是,我们的DBA今天已经出局所以我明天必须在她的帮助下完成。 我会告诉你发生了什么以及解决了什么。