From 7cdbf33cf4e4467a5027a0a51e535bce0f92637e Mon Sep 17 00:00:00 2001 From: v-xiangs Date: Fri, 14 Jul 2017 10:23:18 -0700 Subject: [PATCH] populate table with prepared statement --- .../jdbc/bulkCopy/BulkCopyTestSetUp.java | 4 +- .../testframework/AbstractSQLGenerator.java | 1 + .../testframework/DBPreparedStatement.java | 22 +++++++ .../sqlserver/testframework/DBTable.java | 57 ++++++++++++++++++- 4 files changed, 80 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/bulkCopy/BulkCopyTestSetUp.java b/src/test/java/com/microsoft/sqlserver/jdbc/bulkCopy/BulkCopyTestSetUp.java index 30fbe46a0..2b23bf836 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/bulkCopy/BulkCopyTestSetUp.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/bulkCopy/BulkCopyTestSetUp.java @@ -14,6 +14,7 @@ import com.microsoft.sqlserver.testframework.AbstractTest; import com.microsoft.sqlserver.testframework.DBConnection; +import com.microsoft.sqlserver.testframework.DBPreparedStatement; import com.microsoft.sqlserver.testframework.DBStatement; import com.microsoft.sqlserver.testframework.DBTable;; @@ -37,7 +38,8 @@ static void setUpSourceTable() { stmt = con.createStatement(); sourceTable = new DBTable(true); stmt.createTable(sourceTable); - stmt.populateTable(sourceTable); + DBPreparedStatement pstmt = new DBPreparedStatement(con); + pstmt.populateTable(sourceTable); } finally { con.close(); diff --git a/src/test/java/com/microsoft/sqlserver/testframework/AbstractSQLGenerator.java b/src/test/java/com/microsoft/sqlserver/testframework/AbstractSQLGenerator.java index dd7dc1c4b..e10ad94e0 100644 --- a/src/test/java/com/microsoft/sqlserver/testframework/AbstractSQLGenerator.java +++ b/src/test/java/com/microsoft/sqlserver/testframework/AbstractSQLGenerator.java @@ -22,6 +22,7 @@ public abstract class AbstractSQLGenerator {// implements ISQLGenerator { protected static final String PRIMARY_KEY = "PRIMARY KEY"; protected static final String DEFAULT = "DEFAULT"; protected static final String COMMA = ","; + protected static final String QUESTION_MARK = "?"; // FIXME: Find good word for '. Better replaced by wrapIdentifier. protected static final String TICK = "'"; diff --git a/src/test/java/com/microsoft/sqlserver/testframework/DBPreparedStatement.java b/src/test/java/com/microsoft/sqlserver/testframework/DBPreparedStatement.java index 6ff5fa6f1..99d9c5ab3 100644 --- a/src/test/java/com/microsoft/sqlserver/testframework/DBPreparedStatement.java +++ b/src/test/java/com/microsoft/sqlserver/testframework/DBPreparedStatement.java @@ -30,6 +30,10 @@ public DBPreparedStatement(DBConnection dbconnection) { } /** + * set up internal PreparedStatement with query + * + * @param query + * @return * @throws SQLException * */ @@ -84,4 +88,22 @@ public DBResultSet executeQuery() throws SQLException { return dbresultSet; } + /** + * populate table with values using prepared statement + * + * @param table + * @return true if table is populated + */ + public boolean populateTable(DBTable table) { + return table.populateTableWithPreparedStatement(this); + } + + /** + * + * @return + * @throws SQLException + */ + public boolean execute() throws SQLException { + return pstmt.execute(); + } } \ No newline at end of file diff --git a/src/test/java/com/microsoft/sqlserver/testframework/DBTable.java b/src/test/java/com/microsoft/sqlserver/testframework/DBTable.java index 90d6ae3bc..7c931b784 100644 --- a/src/test/java/com/microsoft/sqlserver/testframework/DBTable.java +++ b/src/test/java/com/microsoft/sqlserver/testframework/DBTable.java @@ -11,6 +11,7 @@ import static org.junit.jupiter.api.Assertions.fail; import java.sql.JDBCType; +import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @@ -143,7 +144,7 @@ private void addColumns(boolean unicode) { public String getTableName() { return tableName; } - + public List getColumns() { return this.columns; } @@ -156,7 +157,7 @@ public List getColumns() { public String getEscapedTableName() { return escapedTableName; } - + public String getDefinitionOfColumns() { return tableDefinition; } @@ -234,7 +235,7 @@ else if (VariableLengthType.ScaleOnly == column.getSqlType().getVariableLengthTy tableDefinition = tableDefinition.substring(0, indexOfLastComma); sb.add(tableDefinition); - + sb.add(CLOSE_BRACKET); return sb.toString(); } @@ -257,6 +258,56 @@ boolean populateTable(DBStatement dbstatement) { return false; } + /** + * using prepared statement to populate table with values + * + * @param dbstatement + * @return + */ + boolean populateTableWithPreparedStatement(DBPreparedStatement dbPStmt) { + try { + populateValues(); + + // create the insertion query + StringJoiner sb = new StringJoiner(SPACE_CHAR); + sb.add("INSERT"); + sb.add("INTO"); + sb.add(escapedTableName); + sb.add("VALUES"); + sb.add(OPEN_BRACKET); + for (int colNum = 0; colNum < totalColumns; colNum++) { + sb.add(QUESTION_MARK); + + if (colNum < totalColumns - 1) { + sb.add(COMMA); + } + } + sb.add(CLOSE_BRACKET); + String sql = sb.toString(); + + dbPStmt.prepareStatement(sql); + + // insert data + for (int i = 0; i < totalRows; i++) { + for (int colNum = 0; colNum < totalColumns; colNum++) { + if (passDataAsHex(colNum)) { + ((PreparedStatement) dbPStmt.product()).setBytes(colNum + 1, ((byte[]) (getColumn(colNum).getRowValue(i)))); + } + else { + dbPStmt.setObject(colNum + 1, String.valueOf(getColumn(colNum).getRowValue(i))); + } + } + dbPStmt.execute(); + } + + return true; + } + catch (SQLException ex) { + fail(ex.getMessage()); + } + return false; + } + private void populateValues() { // generate values for all columns for (int i = 0; i < totalColumns; i++) {