2013-07-18 31 views
0

我試圖使用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); 


} 
+0

使用準備好的語句,沒有混淆和好得多 –

+0

您的查詢中有語法錯誤,找到並修復它。 –

+3

我不確定你應該在INSERT語句中嵌入更多的SELECT語句,還需要使用參數來規避注入攻擊。 –

回答

1

如果要使用子查詢,則需要將它們用作SELECT的一部分,而不是您在VALUES中列出的標量值的一部分。並且FoxPro不允許沒有FROMSELECT

你簡化查詢如下(注意,您要刪除的換行符或插入分號包裹字符串時將其發送到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是有效的和良好的做法。

0

最起碼,使用子查詢的時候,你應該把它們嵌入在另外一組括號中,這樣的事情:

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

雖然我不確定VFP是否支持這種語法,但您必須驗證更改後語法錯誤是否繼續。如果不是,則可以通過事先發出第二個查詢來獲取子查詢結果來避開限制,然後將該數據作爲附加參數用於原始查詢。

+0

VFP不支持該語法。 –