Java 插入dbf表时出现语法错误

Java 插入dbf表时出现语法错误,java,jdbc,foxpro,dbf,visual-foxpro,Java,Jdbc,Foxpro,Dbf,Visual Foxpro,我试图使用jdbc对dbf表进行插入,但每次执行系统时都会出现以下错误: Exception in thread "main" java.sql.SQLException: [Microsoft][ODBC Visual FoxPro Driver]Syntax error. at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source) at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown So

我试图使用jdbc对dbf表进行插入,但每次执行系统时都会出现以下错误:

Exception in thread "main" java.sql.SQLException: [Microsoft][ODBC Visual FoxPro Driver]Syntax error.
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(Unknown Source)
at addProduct.test.main(test.java:29)
代码如下:

public static void main(String[] args) throws ClassNotFoundException, SQLException {
    // TODO Auto-generated method stub
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    String connString="jdbc:odbc:Driver={Microsoft Visual FoxPro Driver};SourceDB=C:\\RestBar\\DBC;SourceType=DBF";//DeafultDir indicates the location of the db
    Connection connection=DriverManager.getConnection(connString);
    Statement query = connection.createStatement();

    ResultSet result;
    String sql="INSERT INTO CUENTAS (NUM_CTA, NUB_CTA, CAJ_CTA, FEC_CTA, HOR_CTA, " +
            "OPE_CTA, MES_CTA, NOM_CTA, UBI_CTA, PER_CTA, ACU_CTA, USU_CTA, KDI_CTA) " +
            "VALUES('0000001', SELECT DES_MEZ FROM MESAS WHERE COD_MEZ = 'T01', '01', " +
            "'2013/07/18', '16:50:33', 0,'002', SELECT DES_MES FROM MESEROS WHERE COD_MES = '002'," +
            " 'T01', '2',0.00, 01, 0.00)";
    query.execute(sql);


}

至少,在使用子查询时,您应该将它们嵌入一组附加的括号中,如下所示:

VALUES('0000001', (SELECT DES_MEZ FROM MESAS WHERE COD_MEZ = 'T01'), '01', " +

我不知道VFP是否支持这种语法,但是,您必须验证更改后语法错误是否继续。如果没有,您可以通过预先发出第二个查询以获得子查询结果来绕过限制,然后将该数据作为附加参数使用到原始查询中。

如果要使用子查询,则需要将其作为
选择的一部分,而不是作为
值中列出的标量值的一部分使用。FoxPro不允许在没有来自
的情况下选择

您的简化查询如下(请注意,在将字符串发送到VFP时,您需要删除换行符或插入分号以包装字符串):


请注意,在编写
INSERT…SELECT语句时,向SELECT语句中添加正确的列名是有效且良好的做法。

使用预先准备好的语句,不要混淆,更好如果查询中出现语法错误,请查找并修复它。我不确定是否应该在INSERT语句中嵌入更多SELECT语句,您还需要使用参数来规避注入攻击。VFP不支持该语法。
INSERT INTO CUENTAS (
    NUM_CTA, 
    NUB_CTA, 
    CAJ_CTA, FEC_CTA, HOR_CTA, OPE_CTA, MES_CTA, 
    NOM_CTA, 
    UBI_CTA, PER_CTA, ACU_CTA, USU_CTA, KDI_CTA
) 
SELECT
    '0000001', 
    DES_MEZ , 
    '01', '2013/07/18', '16:50:33', 0,'002', 
    (SELECT DES_MES FROM MESEROS WHERE COD_MES = '002'), 
    'T01', '2',0.00, 01, 0.00
FROM MESAS WHERE COD_MEZ = 'T01'