Синтаксическая ошибка при вставке в таблицу dbf

я пытаюсь сделать вставку в таблицу dbf с помощью jdbc, но каждый раз, когда я запускаю систему, я получаю эту ошибку:

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);


}

person hidura    schedule 18.07.2013    source источник
comment
используйте подготовленный оператор, без путаницы и намного лучше   -  person jmj    schedule 19.07.2013
comment
у вас есть синтаксическая ошибка в вашем запросе, найдите ее и исправьте.   -  person Mark Rotteveel    schedule 19.07.2013
comment
Я не уверен, что вам следует встраивать дальнейшие операторы SELECT в оператор INSERT, также вам нужно использовать параметры для обхода атак путем внедрения.   -  person Alan B    schedule 19.07.2013


Ответы (2)


Если вы хотите использовать подзапросы, вам нужно использовать их как часть SELECT, а не как часть скалярных значений, перечисленных в VALUES. И FoxPro не позволяет SELECT без FROM.

Далее следует ваш упрощенный запрос (обратите внимание, что вы захотите удалить разрывы строк или вставить точку с запятой, чтобы обернуть строку при отправке ее в 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'

Обратите внимание, что при написании оператора INSERT...SELECT добавление правильных имен столбцов в SELECT допустимо и является хорошей практикой.

person DougM    schedule 01.08.2013

По крайней мере, при использовании подзапросов вы должны заключать их в дополнительный набор скобок, примерно так:

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

Я точно не знаю, поддерживает ли VFP этот синтаксис, вам нужно будет проверить, сохраняется ли синтаксическая ошибка после изменения. Если нет, вы можете обойти ограничение, выполнив заранее второй запрос, чтобы получить результат подзапроса, а затем использовать эти данные в исходном запросе в качестве дополнительного параметра.

person Alejandro    schedule 28.07.2013
comment
VFP не поддерживает этот синтаксис. - person Tamar E. Granor; 30.07.2013