我試圖將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次,此方法也可以很好地工作。
是否有可能您嘗試插入的第106行的某一列比您在oracle中定義的要大? – haki
...或者,類似於@haki所建議的,Access表中的第106(或第107)行中的字符串字段是否可以包含零長度字符串或「Null」值? –
@GordThompson謝謝你的建議= D我檢查了一切,唯一能解決的解決方案是odbc驅動程序在64位系統上不能很好地工作。 我不知道它是否是最佳解決方案,但只是在虛擬機上安裝win7以及訪問(32位)和oracle數據庫。 一切工作完美,我沒有改變一行代碼。 – Sebastian