"参数太少#34;错误,即使我输入兼容的数据类型

时间:2014-10-09 07:18:09

标签: java ms-access ms-access-2007 jdbc-odbc

我正在使用JDK 7,Access 2007和Microsoft Database Engine 2010进行测试应用程序。 通过Java我定义了一个带有'REAL'数据类型字段的表,并且在输入Float或Double时,它表示

  

[Microsoft] [ODBC Microsoft Access Driver]参数太少。预计1。

但如果我直接输入数字就接受了。我应该使用哪些字段类型?

1 个答案:

答案 0 :(得分:0)

使用DDL定义为REAL的列将在Access中创建为“Number(Single)”,对应于JDBC中的Float。因此,您需要使用.setFloat()为该列设置参数值,如

String sql = "INSERT INTO TableName (RealField) VALUES (?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setFloat(1, 3.14F);

这是适用于我的完整测试代码:

import java.sql.*;

public class JDBCQuery {

    public static void main(String args[]) {
        String connectionString = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};"
                + "DBQ=C:/Users/Public/mdbTest.mdb;";
        String tableName = "zzzJavaTest";
        String sql;
        try (Connection con = DriverManager.getConnection(connectionString)) {

            sql = String.format(
                    "DROP TABLE [%s]", 
                    tableName);
            try (Statement s = con.createStatement()) {
                try {
                    s.executeUpdate(sql);
                    System.out.println("Old table dropped.");
                } catch (SQLException e) {
                    if (e.getMessage().endsWith("does not exist.")) {
                        System.out.println("Table did not previously exist.");
                    } else {
                        throw e;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace(System.out);
                System.exit(0);
            }

            sql = String.format(
                    "CREATE TABLE [%s] (id COUNTER PRIMARY KEY, numfield REAL)", 
                    tableName);
            try (Statement s = con.createStatement()) {
                s.executeUpdate(sql);
                System.out.println("New table created.");
            } catch (Exception e) {
                e.printStackTrace(System.out);
                System.exit(0);
            }

            sql = String.format(
                    "INSERT INTO [%s] (numfield) VALUES (?)", 
                    tableName);
            try (PreparedStatement ps = con.prepareStatement(sql)) {
                ps.setFloat(1, 3.14F);
                ps.executeUpdate();
                System.out.println("New row added.");
            } catch (SQLException e) {
                e.printStackTrace(System.out);
                System.exit(0);
            }

        } catch (Exception e) {
            e.printStackTrace(System.out);
            System.exit(0);
        }
    }

}