preparedstatementtest.java
来自「jtds的源码 是你学习java的好东西」· Java 代码 · 共 1,047 行 · 第 1/3 页
JAVA
1,047 行
s.execute("CREATE TABLE #psso6 (test_value NUMERIC(22,0))");
PreparedStatement ps = con.prepareStatement(
"insert into #psso6(test_value) values (?)");
ps.setObject(1, TEST_VALUE, Types.DECIMAL);
assertEquals(1, ps.executeUpdate());
ps.close();
ResultSet rs = s.executeQuery("select test_value from #psso6");
assertTrue(rs.next());
assertEquals("Persisted value not equal to original value",
TEST_VALUE.longValue(), rs.getLong(1));
assertFalse(rs.next());
rs.close();
s.close();
}
/**
* Test for bug [985754] row count is always 0
*/
public void testUpdateCount1() throws Exception {
int count = 50;
Statement stmt = con.createStatement();
stmt.execute("CREATE TABLE #updateCount1 (data INT)");
PreparedStatement pstmt = con.prepareStatement("INSERT INTO #updateCount1 (data) VALUES (?)");
for (int i = 1; i <= count; i++) {
pstmt.setInt(1, i);
assertEquals(1, pstmt.executeUpdate());
}
pstmt.close();
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM #updateCount1");
assertTrue(rs.next());
assertEquals(count, rs.getInt(1));
assertFalse(rs.next());
stmt.close();
rs.close();
pstmt = con.prepareStatement("DELETE FROM #updateCount1");
assertEquals(count, pstmt.executeUpdate());
pstmt.close();
}
/**
* Test for parameter markers in function escapes.
*/
public void testEscapedParams() throws Exception {
PreparedStatement pstmt = con.prepareStatement("SELECT {fn left(?, 2)}");
pstmt.setString(1, "TEST");
ResultSet rs = pstmt.executeQuery();
assertTrue(rs.next());
assertEquals("TE", rs.getString(1));
assertFalse(rs.next());
rs.close();
pstmt.close();
}
/**
* Test for bug [ 1059916 ] whitespace needed in preparedStatement.
*/
public void testMissingWhitespace() throws Exception
{
PreparedStatement pstmt = con.prepareStatement(
"SELECT name from master..syscharsets where description like?and?between csid and 10");
pstmt.setString(1, "ISO%");
pstmt.setInt(2, 0);
ResultSet rs = pstmt.executeQuery();
assertNotNull(rs);
assertTrue(rs.next());
}
/**
* Test for bug [1022968] Long SQL expression error.
* NB. Test must be run with TDS=7.0 to fail.
*/
public void testLongStatement() throws Exception {
Statement stmt = con.createStatement(
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
stmt.execute("CREATE TABLE #longStatement (id int primary key, data varchar(8000))");
StringBuffer buf = new StringBuffer(4096);
buf.append("SELECT * FROM #longStatement WHERE data = '");
for (int i = 0; i < 4000; i++) {
buf.append('X');
}
buf.append("'");
ResultSet rs = stmt.executeQuery(buf.toString());
assertNotNull(rs);
assertFalse(rs.next());
rs.close();
stmt.close();
}
/**
* Test for bug [1047330] prep statement with more than 2100 params fails.
*/
public void testManyParametersStatement() throws Exception {
final int PARAMS = 2110;
Statement stmt = con.createStatement();
makeTestTables(stmt);
makeObjects(stmt, 10);
stmt.close();
StringBuffer sb = new StringBuffer(PARAMS * 3 + 100);
sb.append("SELECT * FROM #test WHERE f_int in (?");
for (int i = 1; i < PARAMS; i++) {
sb.append(", ?");
}
sb.append(")");
try {
// This can work if prepareSql=0
PreparedStatement pstmt = con.prepareStatement(sb.toString());
// Set the parameters
for (int i = 1; i <= PARAMS; i++) {
pstmt.setInt(i, i);
}
// Execute query and count rows
ResultSet rs = pstmt.executeQuery();
int cnt = 0;
while (rs.next()) {
++cnt;
}
// Make sure this worked
assertEquals(9, cnt);
} catch (SQLException ex) {
assertEquals("22025", ex.getSQLState());
}
}
/**
* Test for bug [1010660] 0.9-rc1 setMaxRows causes unlimited temp stored
* procedures. This test has to be run with logging enabled or while
* monitoring it with SQL Profiler to see whether the temporary stored
* procedure is executed or the SQL is executed directly.
*/
public void testMaxRows() throws SQLException {
Statement stmt = con.createStatement();
stmt.execute("CREATE TABLE #maxRows (val int)"
+ " INSERT INTO #maxRows VALUES (1)"
+ " INSERT INTO #maxRows VALUES (2)");
PreparedStatement pstmt = con.prepareStatement(
"SELECT * FROM #maxRows WHERE val<? ORDER BY val");
pstmt.setInt(1, 100);
pstmt.setMaxRows(1);
ResultSet rs = pstmt.executeQuery();
assertNotNull(rs);
assertTrue(rs.next());
assertEquals(1, rs.getInt(1));
assertFalse(rs.next());
rs.close();
pstmt.close();
stmt.executeUpdate("DROP TABLE #maxRows");
stmt.close();
}
/**
* Test for bug [1050660] PreparedStatement.getMetaData() clears resultset.
*/
public void testMetaDataClearsResultSet() throws Exception {
Statement stmt = con.createStatement(
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
stmt.executeUpdate(
"CREATE TABLE #metaDataClearsResultSet (id int primary key, data varchar(8000))");
stmt.executeUpdate("INSERT INTO #metaDataClearsResultSet (id, data)"
+ " VALUES (1, '1')");
stmt.executeUpdate("INSERT INTO #metaDataClearsResultSet (id, data)"
+ " VALUES (2, '2')");
stmt.close();
PreparedStatement pstmt = con.prepareStatement(
"SELECT * FROM #metaDataClearsResultSet ORDER BY id");
ResultSet rs = pstmt.executeQuery();
assertNotNull(rs);
ResultSetMetaData rsmd = pstmt.getMetaData();
assertEquals(2, rsmd.getColumnCount());
assertEquals("id", rsmd.getColumnName(1));
assertEquals("data", rsmd.getColumnName(2));
assertEquals(8000, rsmd.getColumnDisplaySize(2));
assertTrue(rs.next());
assertEquals(1, rs.getInt(1));
assertEquals("1", rs.getString(2));
assertTrue(rs.next());
assertEquals(2, rs.getInt(1));
assertEquals("2", rs.getString(2));
assertFalse(rs.next());
rs.close();
pstmt.close();
}
/**
* Test for bad truncation in prepared statements on metadata retrieval
* (patch [1076383] ResultSetMetaData for more complex statements for SQL
* Server).
*/
public void testMetaData() throws Exception {
Statement stmt = con.createStatement(
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
stmt.executeUpdate("CREATE TABLE #metaData (id int, data varchar(8000))");
stmt.executeUpdate("INSERT INTO #metaData (id, data)"
+ " VALUES (1, 'Data1')");
stmt.executeUpdate("INSERT INTO #metaData (id, data)"
+ " VALUES (1, 'Data2')");
stmt.executeUpdate("INSERT INTO #metaData (id, data)"
+ " VALUES (2, 'Data3')");
stmt.executeUpdate("INSERT INTO #metaData (id, data)"
+ " VALUES (2, 'Data4')");
stmt.close();
// test simple statement
PreparedStatement pstmt = con.prepareStatement("SELECT id " +
"FROM #metaData " +
"WHERE data=? GROUP BY id");
ResultSetMetaData rsmd = pstmt.getMetaData();
assertNotNull("No meta data returned for simple statement", rsmd);
assertEquals(1, rsmd.getColumnCount());
assertEquals("id", rsmd.getColumnName(1));
pstmt.close();
// test more complex statement
pstmt = con.prepareStatement("SELECT id, count(*) as count " +
"FROM #metaData " +
"WHERE data=? GROUP BY id");
rsmd = pstmt.getMetaData();
assertNotNull("No metadata returned for complex statement", rsmd);
assertEquals(2, rsmd.getColumnCount());
assertEquals("id", rsmd.getColumnName(1));
assertEquals("count", rsmd.getColumnName(2));
pstmt.close();
}
/**
* Test for bug [1071397] Error in prepared statement (parameters in outer
* join escapes are not recognized).
*/
public void testOuterJoinParameters() throws SQLException {
Statement stmt = con.createStatement();
stmt.executeUpdate(
"CREATE TABLE #outerJoinParameters (id int primary key)");
stmt.executeUpdate(
"INSERT #outerJoinParameters (id) values (1)");
stmt.close();
// Real dumb join, the idea is to see the parser works fine
PreparedStatement pstmt = con.prepareStatement(
"select * from "
+ "{oj #outerJoinParameters a left outer join #outerJoinParameters b on a.id = ?}"
+ "where b.id = ?");
pstmt.setInt(1, 1);
pstmt.setInt(2, 1);
ResultSet rs = pstmt.executeQuery();
assertTrue(rs.next());
assertEquals(1, rs.getInt(1));
assertEquals(1, rs.getInt(2));
assertFalse(rs.next());
rs.close();
pstmt.close();
pstmt = con.prepareStatement("select {fn round(?, 0)}");
pstmt.setDouble(1, 1.2);
rs = pstmt.executeQuery();
assertTrue(rs.next());
assertEquals(1, rs.getDouble(1), 0);
assertFalse(rs.next());
rs.close();
pstmt.close();
}
/**
* Inner class used by {@link PreparedStatementTest#testMultiThread} to
* test concurrency.
*/
static class TestMultiThread extends Thread {
static Connection con;
static final int THREAD_MAX = 10;
static final int LOOP_MAX = 10;
static final int ROWS_MAX = 10;
static int live;
static Exception error;
int threadId;
TestMultiThread(int n) {
threadId = n;
}
public void run() {
try {
con.rollback();
PreparedStatement pstmt = con.prepareStatement(
"SELECT id, data FROM #TEST WHERE id = ?",
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
for (int i = 1; i <= LOOP_MAX; i++) {
pstmt.clearParameters();
pstmt.setInt(1, i);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
rs.getInt(1);
rs.getString(2);
}
}
pstmt.close();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?