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

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

c3p0.jdbcUrl=jdbc:jtds:sqlserver://localhost:1433/ttcard; c3p0.driverClass=net.sourceforge.jtds.jdbc.Driver c3p0.user=sa c3p0.password=sasa c3p0.minPoolSize=1 c3p0.maxPoolSize=10 c3p0.initialPoolSize=1 c3p0.acquireIncrement=1 c3p0.maxIdleTime=60 c3p0.idleConnectionTestPeriod=60 c3p0.maxStatements=0

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 存储过程的定义部分如下:

ALTER PROCEDURE [dbo].[ttcard_transaction] @ttc_id varchar(16), @ttc_passwd varchar(32), @use_way char(2), @use_type char(2), @use_amount money, @pos_sno varchar(12), @pos_num varchar(8), @shop_id varchar(15), @transaction_message varchar(42), @origin_transaction_message varchar(42), @re_flag int OUTPUT, @re_msg varchar(255) OUTPUT, @rest_amount money OUTPUT, @valid_date datetime OUTPUT, @use_id bigint OUTPUT AS

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注意,以下使用数据库为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、付费专栏及课程。

余额充值