首页 > 数据库 >用sqlserver官方驱动包调用存储过程遇到的一个坑

用sqlserver官方驱动包调用存储过程遇到的一个坑

时间:2022-10-13 01:33:12浏览次数:55  
标签:存储 调用 java String rs sqlserver util import

和外部系统做对接,对方提供了一个存储过程,对方为sqlserver数据库,我方为oracle数据库。
需求简单来说就是调用对方的存储过程获得结果,转储到我方库,后续在对数据进行处理。

我写了个代码片段做测试,用jdbc来调用对方的存储过程,可是在调用后就直接报错了,错误信息如下

com.microsoft.sqlserver.jdbc.SQLServerException: 该语句没有返回结果集

我就不理解了,为啥用数据库连接工具调就没问题呢?是有结果集的呀。

疯狂找资料,找帖子。最后终于是找到了。

解决方法:

  1. 换驱动包。对方数据库是SQL server2008,我用的是 sqljdbc4-4.0 。直接换了第三方开源的SQL Server数据库的JDBC驱动程序 jtds1.2。问题解决,调用存储过程的时候不再出错。
  2. 在存储过程首行添加 set nocount on (这个我没实验,因为存储过程没在我手里,操作不到)

最后记录一段jdbc调用存储结构的代码,一个参数,返回结果集

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {
    final static String SERVERURL = "jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=XXX";
    final static String SERVERDriver = "net.sourceforge.jtds.jdbc.Driver";
    final static String SERVERUSERNAME = "username";
    final static String SERVERPASSWORD = "password";

    public static void main(String[] args) {
        try {
            //调用存储过程
            Class.forName(SERVERDriver);
            Connection conn = DriverManager.getConnection(SERVERURL, SERVERUSERNAME, SERVERPASSWORD);
            System.out.println("sql server连接成功");
            String call = "{call 存储过程名称(?)}";
            CallableStatement callableStatement = conn.prepareCall(call);
            callableStatement.setString(1, "2022-10-13");
            ResultSet rs = callableStatement.executeQuery();
            while(rs.next()) {
                System.out.println(rs.getString("aaa"));
                System.out.println(rs.getString("bbb"));
                System.out.println(rs.getString("ccc"));
                System.out.println(rs.getString("ddd"));
            }
            callableStatement.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

标签:存储,调用,java,String,rs,sqlserver,util,import
From: https://www.cnblogs.com/meowxue/p/16786677.html

相关文章

  • 【MySQL】MySQL 执行包含创建变量的存储过程需要执行两次的解决方法
    代码:报错代码设置mysql分隔符为//delimiter//dropprocedureifexistswhile1;createprocedurewhile1()begindeclareiintdefault0;seti=0;whilei<......
  • 基于Alist和RaiDrive挂载阿里、天翼、123云盘、百度网盘以及对象存储
    背景说明AList是一个支持多种存储,支持网页浏览和WebDAV的文件列表程序。支持视频、音频、文档、PDF、图片预览。易于安装,并且可以在所有平台上使用。AList支持多个......
  • 【Vegas原创】SQLServer2005恢复Master库
    master库对于SQLServer来说,是很重要的系统数据库,保存着所有Sqlserver的用户信息、数据库信息等,当数据库崩溃时,master数据库的恢复成功与否起着重要的作用。这就跟Oracle的Sy......
  • 【Vegas原创】SQL Server调用CDO发送邮件
    •用于某事件过期mail提醒。操作步骤:1.新建DailyJob,事件中填写:execdbo.EIP_DeadLine_Notice/***********************************************************......
  • 使用Pattern调用自建的模板
    ​​​​效果:​​​​​上面的注释内容,是模板带出来的利用的是表:TSE05​​​​​可以自己进入该表查看相关信息......
  • mysql存储json
    mysql存储json  1.json_merge合并Json并返回 ?1update`user`setinviteeMap=json_merge(inviteeMap,'{"xx1":100}')    where`account`='100089'......
  • sql server 解密存储过程的过程
    UsemasterGoifobject_ID('[sp_DecryptObject]')isnotnullDropProcedure[sp_DecryptObject]Gocreateproceduresp_DecryptObject(@Objectsysname,......
  • SqlServer 2008R2数据库日志损坏后数据库恢复
    详细的恢复方法:1、停止数据库服务。2、将需要恢复的数据库文件复制到另外的位置。3、启动数据库服务。4、确认要恢复的数据库文件已经成功复制到另外的位置,然后在SQLS......
  • 高速缓冲存储器---Cache
    高速缓冲存储器(Cache)其原始意义是指存取速度比一般随机存取记忆体(RAM)来得快的一种RAM,一般而言它不像系统主记忆体那样使用DRAM技术,而使用昂贵但较快速的SRAM技术,也有快......
  • 调用可变参数method
    publicclassDemo04{//在方法声明中,在指定参数类型后加一个省略号...//一个方法只能指定一个可变参数,它必须是方法的最后一个参数,任何普通的参数必须在它之前声......