簡體   English   中英

Java准備的語句查詢返回錯誤,但是如果我將其打印並直接在數據庫上執行,它將起作用

[英]java prepared statement query is returning an error but If I print it and execute on the database directly it works

我有以下代碼寧靜的代碼,它們試圖從XML文件創建查詢並將其添加到批處理中,因此我可以執行大批量執行,但由於不斷收到錯誤而對我不起作用,因此我嘗試執行未經批處理的preparestatement,並且不斷收到錯誤消息:

“您的SQL語法有錯誤;請在與MySQL服務器版本相對應的手冊中找到在第1行'dept_no,dept_name VALUES('d009','客戶服務')'附近使用的正確語法”

盡管當我調試代碼時,我得到的是准備好的語句中的查詢是INSERT INTO departments dept_no, dept_name VALUES ('d009', 'Customer Service')我不知道發生了什么事,有人可以建議您並幫助我完成此操作大批執行?

這是我有的方法:

public void invokePreparedStatement(QueryBuilder queryBuilder) {
    queryRunner = new QueryRunner();

    StringBuilder query = new StringBuilder();
    query.append("INSERT INTO " + queryBuilder.getTableName());
    QName columns;
    String values;

    for (int i = 0; i < queryBuilder.getColumns().size(); i++) {
        columns = (queryBuilder.getColumns().get(i));
        query.append(" " + columns.toString());
        if (i != queryBuilder.getColumns().size() - 1)
            query.append(", ");
        else
            query.append(" VALUES (");
    }

    for (int i = 0; i < queryBuilder.getValues().size(); i++) {
        query.append("?");
        if (i != queryBuilder.getValues().size() - 1)
            query.append(", ");
        else
            query.append(")");
    }

    try {
        PreparedStatement preparedStatement = connection.prepareStatement(query.toString());
        StringBuilder s = new StringBuilder();
        preparedStatement = buildQuery(queryBuilder, preparedStatement);
        preparedStatement.execute();
        connection.commit();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public PreparedStatement buildQuery(QueryBuilder queryBuilder, PreparedStatement ps) throws SQLException {
    StringBuilder query = new StringBuilder("INSERT INTO ");
    query.append(queryBuilder.getTableName() + " (");
    QName columns;
    String values;
    int counter;
    for (int i = 0; i < queryBuilder.getColumns().size(); i++) {
        getCoulmnAndValue(queryBuilder, query, i);
        if (i != queryBuilder.getColumns().size() - 1)
            query.append(", ");
        else
            query.append(") VALUES (");
    }

    for (int i = 0; i < queryBuilder.getValues().size(); i++) {
        values = (queryBuilder.getValues().get(i));
        query.append(values);
        if (i != queryBuilder.getValues().size() - 1)
            query.append(", ");
        else
            query.append(")");
        counter = i + 1;
        ps.setObject(counter, values);
    }

    return ps;
}

假設您的queryBuilder有一個名為T表,其中有兩個名為AB列。 然后,生成的SQL為:

INSERT INTO T A,  B VALUES (?, ?)

這是無效的語法,因為列名必須在()

INSERT INTO T (A, B) VALUES (?, ?)

這正是該錯誤消息說,當他說,這個問題是近A ,因為(丟失在那里 ,不只是“接近”,但究竟在那里。

建議不要按以下方式測試size - 1

StringBuilder query = new StringBuilder();
query.append("INSERT INTO ")
     .append(queryBuilder.getTableName())
     .append(" (");
for (int i = 0; i < queryBuilder.getColumns().size(); i++) {
    if (i != 0)
        query.append(", ");
    query.append(queryBuilder.getColumns().get(i));
}
query.append(") VALUES (");
for (int i = 0; i < queryBuilder.getValues().size(); i++) {
    if (i != 0)
        query.append(", ");
    query.append("?");
}
query.append(")");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM