使用JTDS调用MS SQL Server 2005的存储过程

本文介绍了如何在Linux环境下利用JTDS连接SQL Server 2005,并通过C3P0连接池调用存储过程。详细步骤包括打开SQL Server的TCP/IP端口,配置C3P0连接池,以及展示调用存储过程的代码示例。存储过程的输入输出参数也在文中说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JTDS适合在Linux下使用,无需jdbc-odbc桥。调用存储过程时候可以用@ttc_id的方式传入参数。

 

在实际的项目中,我们鼓励使用存储过程而非jee的持久化方式。存储过程性能更高,大大减少网络上传输的数据量。

 

 

1 打开SQL Server Configuration Manager。

   将SQL Server 2005网络配置中的MSSQLSERVER协议中的TCP/IP打开。确定netstat -ano中有tcp 1433端口。

   默认安装该端口并没有打开

 

2 使用C3P0做连接池

 

编辑c3p0.properties

 

 

3 初始化连接池

public static ComboPooledDataSource cpds;

 

cpds = new ComboPooledDataSource();

 

4 调用的代码

 

            conn = TransactionServer.cpds.getConnection();

            cstmt = conn
                    .prepareCall("{call dbo.ttcard_transaction(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}");

            cstmt.setString("@ttc_id", ttc_id);
            cstmt.setString("@ttc_passwd", password);
            cstmt.setString("@use_way", use_way);
            cstmt.setString("@use_type", use_type);
            cstmt.setDouble("@use_amount", use_amount);
            cstmt.setString("@pos_sno", pos_sno);
            cstmt.setString("@pos_num", pos_num);
            cstmt.setString("@shop_id", shop_id);
            cstmt.setString("@transaction_message", transaction_message);
            cstmt.setString("@origin_transaction_message", origin_transaction_message);

            cstmt.registerOutParameter("@re_flag", java.sql.Types.INTEGER); // re_flag
            cstmt.registerOutParameter("@re_msg", java.sql.Types.VARCHAR); // re_msg
            cstmt.registerOutParameter("@rest_amount", java.sql.Types.DOUBLE); // rest_amount
            cstmt.registerOutParameter("@valid_date", java.sql.Types.DATE); // valid_date
            cstmt.registerOutParameter("@use_id", java.sql.Types.BIGINT); // use_id

 

            cstmt.execute();

            re_flag = cstmt.getInt("@re_flag");
            re_msg = cstmt.getString("@re_msg");
            rest_amount = cstmt.getDouble("@rest_amount");
            valid_date = cstmt.getDate("@valid_date");

 

           cstmt.close();
           cstmt = null;

 

           conn.close();  //一定要关闭连接,把连接还给连接池

           conn = null;

 

5 存储过程的定义部分如下:

注意,以下使用数据库为sql2000,驱动jtds1.2.2 一、调用存储过程(无结果集返回) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); callableStatement.execute(); //获得sql的消息并输出,这个估计很多人都需要 SQLWarning sqlWarning = callableStatement.getWarnings(); while (sqlWarning != null) { System.out.println("sqlWarning.getErrorCode() = " + sqlWarning.getErrorCode()); System.out.println("sqlWarning.getSQLState() = " + sqlWarning.getSQLState()); System.out.println("sqlWarning.getMessage() = " + sqlWarning.getMessage()); sqlWarning = sqlWarning.getNextWarning(); } //close ConnectionHelper.closeConnection(callableStatement, connection); 二、调用存储过程,返回sql类型数据(非记录集) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); //重点是这句1 callableStatement.registerOutParameter(3, Types.INTEGER); callableStatement.execute(); //取返回结果,重点是这句2 //int rsCount = callableStatement.getInt(3); //close ConnectionHelper.closeConnection(callableStatement, connection); 三、重点来了,返回记录集,多记录集 注意,不需要注册返回结果参数,只需要在sql中select出结果即可 例如:select * from tableName 即可得到返回结果 Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?) }"); //此处参数与结果集返回没有关系 callableStatement.setString(1, "xxxxxxxx"); callableStatement.execute(); ResultSet resultSet = callableStatement.getResultSet(); //以上两个语句,可以使用ResultSet resultSet = callableStatement.executeQuery();替代 //多结果返回 ResultSet resultSet2; if (callableStatement.getMoreResults()) { resultSet2 = callableStatement.getResultSet(); while (resultSet2.next()) { } } //close ConnectionHelper.closeConnection(callableStatement, connection); 提示:多结果返回可以使用如下代码(以上主要让大家明白,单一结果和多结果的区别): Boolean hasMoreResult = true; while (hasMoreResult) { ResultSet resultSet = callableStatement.getResultSet(); while (resultSet.next()) { } hasMoreResult = callableStatement.getMoreResults(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值