preparedstatementtest.java
来自「jtds的源码 是你学习java的好东西」· Java 代码 · 共 1,047 行 · 第 1/3 页
JAVA
1,047 行
// jTDS JDBC Driver for Microsoft SQL Server and Sybase
// Copyright (C) 2004 The jTDS Project
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
package net.sourceforge.jtds.test;
import java.math.BigDecimal;
import java.sql.*;
import java.util.*;
/**
* @version $Id: PreparedStatementTest.java,v 1.46 2007/07/08 18:26:26 bheineman Exp $
*/
public class PreparedStatementTest extends TestBase {
public PreparedStatementTest(String name) {
super(name);
}
public void testPreparedStatement() throws Exception {
PreparedStatement pstmt = con.prepareStatement("SELECT * FROM #test");
Statement stmt = con.createStatement();
makeTestTables(stmt);
makeObjects(stmt, 10);
stmt.close();
ResultSet rs = pstmt.executeQuery();
dump(rs);
rs.close();
pstmt.close();
}
public void testScrollablePreparedStatement() throws Exception {
Statement stmt = con.createStatement();
makeTestTables(stmt);
makeObjects(stmt, 10);
stmt.close();
PreparedStatement pstmt = con.prepareStatement("SELECT * FROM #test",
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = pstmt.executeQuery();
assertTrue(rs.isBeforeFirst());
while (rs.next()) {
}
assertTrue(rs.isAfterLast());
//This currently fails because the PreparedStatement
//Doesn't know it needs to create a cursored ResultSet.
//Needs some refactoring!!
// SAfe Not any longer. ;o)
while (rs.previous()) {
}
assertTrue(rs.isBeforeFirst());
rs.close();
pstmt.close();
}
public void testPreparedStatementAddBatch1()
throws Exception {
int count = 50;
Statement stmt = con.createStatement();
stmt.execute("CREATE TABLE #psbatch1 (f_int INT)");
int sum = 0;
con.setAutoCommit(false);
PreparedStatement pstmt = con.prepareStatement("INSERT INTO #psbatch1 (f_int) VALUES (?)");
for (int i = 0; i < count; i++) {
pstmt.setInt(1, i);
pstmt.addBatch();
sum += i;
}
int[] results = pstmt.executeBatch();
assertEquals(results.length, count);
for (int i = 0; i < count; i++) {
assertEquals(results[i], 1);
}
pstmt.close();
con.commit();
con.setAutoCommit(true);
ResultSet rs = stmt.executeQuery("SELECT SUM(f_int) FROM #psbatch1");
assertTrue(rs.next());
System.out.println(rs.getInt(1));
assertEquals(rs.getInt(1), sum);
rs.close();
stmt.close();
}
/**
* Test for [924030] EscapeProcesser problem with "{}" brackets
*/
public void testPreparedStatementParsing1() throws Exception {
String data = "New {order} plus {1} more";
Statement stmt = con.createStatement();
stmt.execute("CREATE TABLE #psp1 (data VARCHAR(32))");
stmt.close();
stmt = con.createStatement();
stmt.execute("create procedure #sp_psp1 @data VARCHAR(32) as INSERT INTO #psp1 (data) VALUES(@data)");
stmt.close();
PreparedStatement pstmt = con.prepareStatement("{call #sp_psp1('" + data + "')}");
pstmt.execute();
pstmt.close();
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT data FROM #psp1");
assertTrue(rs.next());
assertTrue(data.equals(rs.getString(1)));
assertFalse(rs.next());
rs.close();
stmt.close();
}
/**
* Test for bug [1008882] Some queries with parameters cannot be executed with 0.9-rc1
*/
public void testPreparedStatementParsing2() throws Exception {
PreparedStatement pstmt = con.prepareStatement(" SELECT ?");
pstmt.setString(1, "TEST");
ResultSet rs = pstmt.executeQuery();
assertTrue(rs.next());
assertEquals("TEST", rs.getString(1));
assertFalse(rs.next());
pstmt.close();
rs.close();
}
/**
* Test for "invalid parameter index" error.
*/
public void testPreparedStatementParsing3() throws Exception {
PreparedStatement pstmt = con.prepareStatement(
"UPDATE dbo.DEPARTMENTS SET DEPARTMENT_NAME=? WHERE DEPARTMENT_ID=?");
pstmt.setString(1, "TEST");
pstmt.setString(2, "TEST");
pstmt.close();
}
/**
* Test for [931090] ArrayIndexOutOfBoundsException in rollback()
*/
public void testPreparedStatementRollback1() throws Exception {
Connection localCon = getConnection();
Statement stmt = localCon.createStatement();
stmt.execute("CREATE TABLE #psr1 (data BIT)");
localCon.setAutoCommit(false);
PreparedStatement pstmt = localCon.prepareStatement("INSERT INTO #psr1 (data) VALUES (?)");
pstmt.setBoolean(1, true);
assertEquals(1, pstmt.executeUpdate());
pstmt.close();
localCon.rollback();
ResultSet rs = stmt.executeQuery("SELECT data FROM #psr1");
assertFalse(rs.next());
rs.close();
stmt.close();
localCon.close();
try {
localCon.commit();
fail("Expecting commit to fail, connection was closed");
} catch (SQLException ex) {
assertEquals("HY010", ex.getSQLState());
}
try {
localCon.rollback();
fail("Expecting rollback to fail, connection was closed");
} catch (SQLException ex) {
assertEquals("HY010", ex.getSQLState());
}
}
/**
* Test for bug [938494] setObject(i, o, NUMERIC/DECIMAL) cuts off decimal places
*/
public void testPreparedStatementSetObject1() throws Exception {
BigDecimal data = new BigDecimal(3.7D);
Statement stmt = con.createStatement();
stmt.execute("CREATE TABLE #psso1 (data MONEY)");
PreparedStatement pstmt = con.prepareStatement("INSERT INTO #psso1 (data) VALUES (?)");
pstmt.setObject(1, data);
assertEquals(1, pstmt.executeUpdate());
pstmt.close();
ResultSet rs = stmt.executeQuery("SELECT data FROM #psso1");
assertTrue(rs.next());
assertEquals(data.doubleValue(), rs.getDouble(1), 0);
assertFalse(rs.next());
rs.close();
stmt.close();
}
/**
* Test for bug [938494] setObject(i, o, NUMERIC/DECIMAL) cuts off decimal places
*/
public void testPreparedStatementSetObject2() throws Exception {
BigDecimal data = new BigDecimal(3.7D);
Statement stmt = con.createStatement();
stmt.execute("CREATE TABLE #psso2 (data MONEY)");
PreparedStatement pstmt = con.prepareStatement("INSERT INTO #psso2 (data) VALUES (?)");
pstmt.setObject(1, data, Types.NUMERIC);
assertEquals(1, pstmt.executeUpdate());
pstmt.close();
ResultSet rs = stmt.executeQuery("SELECT data FROM #psso2");
assertTrue(rs.next());
assertEquals(data.doubleValue(), rs.getDouble(1), 0);
assertFalse(rs.next());
rs.close();
stmt.close();
}
/**
* Test for bug [938494] setObject(i, o, NUMERIC/DECIMAL) cuts off decimal places
*/
public void testPreparedStatementSetObject3() throws Exception {
BigDecimal data = new BigDecimal(3.7D);
Statement stmt = con.createStatement();
stmt.execute("CREATE TABLE #psso3 (data MONEY)");
PreparedStatement pstmt = con.prepareStatement("INSERT INTO #psso3 (data) VALUES (?)");
pstmt.setObject(1, data, Types.DECIMAL);
assertEquals(1, pstmt.executeUpdate());
pstmt.close();
ResultSet rs = stmt.executeQuery("SELECT data FROM #psso3");
assertTrue(rs.next());
assertEquals(data.doubleValue(), rs.getDouble(1), 0);
assertFalse(rs.next());
rs.close();
stmt.close();
}
/**
* Test for bug [938494] setObject(i, o, NUMERIC/DECIMAL) cuts off decimal places
*/
public void testPreparedStatementSetObject4() throws Exception {
BigDecimal data = new BigDecimal(3.7D);
Statement stmt = con.createStatement();
stmt.execute("CREATE TABLE #psso4 (data MONEY)");
PreparedStatement pstmt = con.prepareStatement("INSERT INTO #psso4 (data) VALUES (?)");
pstmt.setObject(1, data, Types.NUMERIC, 4);
assertEquals(1, pstmt.executeUpdate());
pstmt.close();
ResultSet rs = stmt.executeQuery("SELECT data FROM #psso4");
assertTrue(rs.next());
assertEquals(data.doubleValue(), rs.getDouble(1), 0);
assertFalse(rs.next());
rs.close();
stmt.close();
}
/**
* Test for bug [938494] setObject(i, o, NUMERIC/DECIMAL) cuts off decimal places
*/
public void testPreparedStatementSetObject5() throws Exception {
BigDecimal data = new BigDecimal(3.7D);
Statement stmt = con.createStatement();
stmt.execute("CREATE TABLE #psso5 (data MONEY)");
PreparedStatement pstmt = con.prepareStatement("INSERT INTO #psso5 (data) VALUES (?)");
pstmt.setObject(1, data, Types.DECIMAL, 4);
assertEquals(1, pstmt.executeUpdate());
pstmt.close();
ResultSet rs = stmt.executeQuery("SELECT data FROM #psso5");
assertTrue(rs.next());
assertEquals(data.doubleValue(), rs.getDouble(1), 0);
assertFalse(rs.next());
rs.close();
stmt.close();
}
/**
* Test for bug [1204658] Conversion from Number to BigDecimal causes data
* corruption.
*/
public void testPreparedStatementSetObject6() throws Exception {
final Long TEST_VALUE = new Long(2265157674817400199L);
Statement s = con.createStatement();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?