Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String &引用;无效的字符串或缓冲区长度“;当我复制超过106个值时?_String_Oracle_Ms Access_Buffer - Fatal编程技术网

String &引用;无效的字符串或缓冲区长度“;当我复制超过106个值时?

String &引用;无效的字符串或缓冲区长度“;当我复制超过106个值时?,string,oracle,ms-access,buffer,String,Oracle,Ms Access,Buffer,我正在尝试将Access数据库复制到Oracle SQL。它工作到必须复制超过106个值的顶点。(有问题的表格包含1000多个值) 我使用了jdbc:odbc桥驱动程序和专用的MS驱动程序。我运行的是64位Oracle数据库(11g)、64位windows 7和64位jdk 下面是我的Access数据库字段及其数据类型的图片 下面是我用来复制值的代码。(请记住,相同的方法适用于值小于100的表) 此外,它们的顺序也不正确,因为之前有人建议我将它们按数据类型排序,但这没有帮助 public st

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

我使用了jdbc:odbc桥驱动程序和专用的MS驱动程序。我运行的是64位Oracle数据库(11g)、64位windows 7和64位jdk

下面是我的Access数据库字段及其数据类型的图片

下面是我用来复制值的代码。(请记住,相同的方法适用于值小于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次以内,那么这个方法也可以很好地工作

我在浏览互联网后发现,odbc驱动程序不喜欢64位系统

我当时所做的是:

在虚拟机上安装windows 7(32位)、Access(32位)和Oracle Database 11g(32位)

我使用“Microsoft access驱动程序(*.mdb,*.accdb)”链接了access(mdb)文件

然后,我像往常一样运行了这个程序(链接到localhost oracle数据库),它运行得非常好

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


感谢所有发表建议的人

您尝试插入的第106行中有一列可能比oracle中定义的列大吗?…或者,与@haki建议的类似,第106行(或第107行)中可能有一个字符串字段Access表中的行包含零长度字符串或
Null
值?@GordThompson感谢您的建议=D我检查了所有内容,我能想到的唯一解决方案是odbc驱动程序在64位系统上运行不太好。我不知道这是否是最佳解决方案,但只是在虚拟机上安装了win7以及access(32位)和oracle数据库。一切都很完美,我没有修改一行代码。只是想澄清一下:是Oracle ODBC驱动程序在64位环境中给您带来了麻烦,是吗?