2013-05-18 33 views
1

我試圖將Access數據庫複製到Oracle SQL。它最重要的是它必須複製超過106個值。 (有問題的表格包含超過1000個值)「無效的字符串或緩衝區長度」當我複製超過106個值?

我已經使用了jdbc:odbc橋驅動程序和專用MS驅動程序。我正在運行64位Oracle數據庫(11g),64位Windows 7和64位jdk。

這是我的Access數據庫字段及其數據類型的圖片。

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) 

預先感謝任何提示或建議。

編輯:如果我限制while循環運行少於100次,此方法也可以很好地工作。

+2

是否有可能您嘗試插入的第106行的某一列比您在oracle中定義的要大? – haki

+0

...或者,類似於@haki所建議的,Access表中的第106(或第107)行中的字符串字段是否可以包含零長度字符串或「Null」值? –

+0

@GordThompson謝謝你的建議= D我檢查了一切,唯一能解決的解決方案是odbc驅動程序在64位系統上不能很好地工作。 我不知道它是否是最佳解決方案,但只是在虛擬機上安裝win7以及訪問(32位)和oracle數據庫。 一切工作完美,我沒有改變一行代碼。 – Sebastian

回答

0

通過互聯網搜索後,我發現odbc驅動程序不喜歡64位系統。

我那麼做的是:

安裝Windows 7(32位),接入(32位)和虛擬機上的Oracle數據庫11g(32位)。

我使用'Microsoft Access Driver(*。mdb,* .accdb)'鏈接訪問(mdb)文件。

然後我像往常一樣運行程序(鏈接到本地​​主機的oracle數據庫),它都運行完美。

我不知道這個解決方案是否是最優的,但它似乎解決了我曾經有過的每一個問題。

感謝所有發佈建議的人!

+0

只是爲了澄清:這是在64位環境中給您帶來麻煩的* Oracle * ODBC驅動程序,是嗎? –

相關問題