Я пытаюсь скопировать базу данных Access в Oracle SQL. Он работает над тем, что он должен копировать более 106 значений. (Таблица проблем содержит более 1000 значений)«Недопустимая строка или длина буфера», когда я копирую более 106 значений?
Я использовал драйверы моста jdbc: odbc и выделенный драйвер MS. Я запускаю 64-битную Oracle Database (11g), 64-битные окна 7 и 64-разрядные jdk.
Вот изображение полей базы данных моего доступа и их типов данных.
http://i.imgur.com/beQ0kY2.jpg
Вот код, я использую, чтобы скопировать значения. (Имейте в виду, что тот же метод отлично работает с таблицами с менее чем 100 значениями)
Также они вышли из строя, потому что кто-то ранее предположил, что я поместил их в порядке их типа, но это не помогло.
public static void copyCriminalTable()
{
PreparedStatement updateCourtOrderTable = null;
//Set up "insert" string
String insertString = "INSERT INTO criminal "
+ "(id, firstname, lastname, streetaddress, suburb, postcode, state, email, phonenumber, dob, weight, height, licencenumber) "
+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
String MSAccessQuery = "SELECT * FROM criminal";
try
{
//create a query object for MSAccess
dbmsMSAccess.DBMSStatement = dbmsMSAccess.DBMSConnection.createStatement();
//Query the MSAccess database for extraction
dbmsMSAccess.DBMSResultSet = dbmsMSAccess.DBMSStatement.executeQuery(MSAccessQuery);
//make query object for Oracle
dbmsOracle.DBMSOracleStatement = dbmsOracle.DBMSOracleConnection.createStatement();
//dbmsOracle.DBMSOracleStatement.execute("TRUNCATE TABLE criminal");
dbmsOracle.DBMSOracleConnection.setAutoCommit(false);
updateCourtOrderTable = dbmsOracle.DBMSOracleConnection.prepareStatement(insertString);
while(dbmsMSAccess.DBMSResultSet.next())
{
updateCourtOrderTable.setString(13, dbmsMSAccess.DBMSResultSet.getString("licencenumber"));
updateCourtOrderTable.setString(1, dbmsMSAccess.DBMSResultSet.getString("ID"));
updateCourtOrderTable.setString(2, dbmsMSAccess.DBMSResultSet.getString("firstname"));
updateCourtOrderTable.setString(3, dbmsMSAccess.DBMSResultSet.getString("lastname"));
updateCourtOrderTable.setString(4, dbmsMSAccess.DBMSResultSet.getString("streetaddress"));
updateCourtOrderTable.setString(5, dbmsMSAccess.DBMSResultSet.getString("suburb"));
updateCourtOrderTable.setString(6, dbmsMSAccess.DBMSResultSet.getString("postcode"));
updateCourtOrderTable.setString(7, dbmsMSAccess.DBMSResultSet.getString("state"));
updateCourtOrderTable.setString(8, dbmsMSAccess.DBMSResultSet.getString("email"));
updateCourtOrderTable.setString(9, dbmsMSAccess.DBMSResultSet.getString("phonenumber"));
updateCourtOrderTable.setDate(10, dbmsMSAccess.DBMSResultSet.getDate("dob"));
updateCourtOrderTable.setString(11, dbmsMSAccess.DBMSResultSet.getString("weight"));
updateCourtOrderTable.setString(12, dbmsMSAccess.DBMSResultSet.getString("height"));
updateCourtOrderTable.executeUpdate();
//set delay
//Thread.sleep(20);
}
System.out.println("Criminal: ACCESS DATA COPIED TO ORACLE");
}
catch(Exception X)
{
System.out.println("ERROR - Criminal TABLE");
X.printStackTrace();
}
}
Ошибка я получаю:
ERROR - Criminal TABLE
java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid string or buffer length
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6956)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7113)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.java:3906)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(JdbcOdbcResultSet.java:5697)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:353)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:410)
at DBMSISYS254.DBMSMain.copyCriminalTable(DBMSMain.java:178)
at DBMSISYS254.DBMSMain.copyAllTables(DBMSMain.java:58)
at DBMSISYS254.DBMSMain.main(DBMSMain.java:44)
Заранее спасибо за любые советы или предложения.
EDIT: Этот метод также отлично работает, если я ограничиваю цикл while менее 100 раз.
Возможно ли, что один из столбцов 106-й строки, которую вы пытаетесь вставить, больше того, что вы определили в оракуле? – haki
... или, подобно предложению @haki, может ли поле строки в 106-й (или 107-й) строке таблицы Access содержать строку нулевой длины или значение «Null»? –
@GordThompson Спасибо за предложения = D Я проверил все, и единственным решением, которое я мог придумать, было то, что драйвер odbc не очень хорошо работает на 64-битных системах. Я не знаю, является ли это оптимальным решением, а просто установлено win7 на виртуальной машине, а также доступ (32 бит) и база данных оракула. Все работает отлично, и я не менял строку кода. – Sebastian