2013-05-18 2 views
1

Я пытаюсь скопировать базу данных 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 раз.

+2

Возможно ли, что один из столбцов 106-й строки, которую вы пытаетесь вставить, больше того, что вы определили в оракуле? – haki

+0

... или, подобно предложению @haki, может ли поле строки в 106-й (или 107-й) строке таблицы Access содержать строку нулевой длины или значение «Null»? –

+0

@GordThompson Спасибо за предложения = D Я проверил все, и единственным решением, которое я мог придумать, было то, что драйвер odbc не очень хорошо работает на 64-битных системах. Я не знаю, является ли это оптимальным решением, а просто установлено win7 на виртуальной машине, а также доступ (32 бит) и база данных оракула. Все работает отлично, и я не менял строку кода. – Sebastian

ответ

0

Я узнал, после очистки через Интернет, что драйвер odbc не любит 64-битные системы.

То, что я тогда сделал:

Установка Windows 7 (32 бит), Access (32bit) и Oracle Database 11g (32bit) на виртуальной машине.

Я связал файл доступа (mdb) с помощью «Microsoft Access Driver (*. Mdb, * .accdb)».

Я тогда запускал программу, как обычно (ссылка на локальную базу данных оракула), и все это отлично работало.

Я не знаю, было ли это решение оптимальным, но оно, казалось, решало каждую проблему, которую я когда-то имел.

Спасибо всем, кто разместил предложения!

+0

Просто пояснить: Это был * Oracle * ODBC драйвер, который давал вам проблемы в 64-битной среде, не так ли? –

Смежные вопросы