1

我正在尝试将 Access 数据库复制到 Oracle SQL。它的工作原理是它必须复制超过 106 个值。(有问题的表包含超过 1000 个值)

我已经使用了 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 次,此方法也很有效。

4

1 回答 1

0

通过互联网搜索后,我发现 odbc 驱动程序不喜欢 64 位系统。

我当时做的是:

在虚拟机上安装 windows 7(32 位)、Access(32 位)和 Oracle 数据库 11g(32 位)。

我使用“Microsoft Access Driver(*.mdb, *.accdb)”链接了 access(mdb) 文件。

然后我像往常一样运行程序(链接到 localhost oracle 数据库),一切运行良好。

我不知道这个解决方案是否最优,但它似乎解决了我曾经遇到的每一个问题。

感谢所有发布建议的人!

于 2013-05-20T09:52:48.467 回答