MS доступ к базе данных с Java - PullRequest
1 голос
/ 27 июля 2011

Я создаю Java-программу, с помощью которой я редактирую базу данных Microsoft Access.У меня есть определенный случай, в котором мне нужно выполнить поиск, если в моей таблице уже существует определенная запись, если это так, я хочу обновить ее, а если нет, я хочу создать ее с нуля.

Я нашел этот фрагмент кода:

IF EXISTS (SELECT * FROM USERS WHERE USERID=@UID) select 1 else select 

Этот код выдает ошибку, в которой говорится, что ожидался оператор SELECT, UPDATE или DELETE.

Вкод, который я сам пробовал, я сделал следующее:

try{
            s = con.createStatement();
            s.executeQuery("SELECT * FROM table WHERE date='" + today + "'");
            rset = s.getResultSet();    

            if (rset.getString("date") == null){

                s = con.createStatement();     
                s.executeUpdate("INSERT INTO table VALUES ('" + today + "','" + cflow + "','" + vat + "','" + cnn + "')");

            }
        }

        catch (SQLException exp)
        {
            System.err.println(exp);
        }

Но с этим кодом, когда запись еще не существует, пользовательский ввод не обновляется внутри базы данных.

Спасибо за ваше время:)

Ответы [ 4 ]

1 голос
/ 27 июля 2011

1-й: Если я правильно помню, тогда

IF EXISTS (SELECT * FROM USERS WHERE USERID=@UID) select 1 else select 

неполный транзакционный SQL-оператор, используемый ядром SQL из системы баз данных.

2й:

if (rset.getString("date") == null){}

вам следует избегать этого, потому что есть хороший шанс получить исключение Nullpointer.

На мой взгляд, лучше проверить размер результирующего набора для нуля или сам набор результатов для значения NULL .

Если оператор UPDATE также не будет выполнен, проверьте оператор SELECT, используя механизм базы данных -Ms Access, SQL Server и т. Д., Напрямую. Преимущество в том, что вы можете исключить ошибку в своем запросе SELECT.

0 голосов
/ 16 марта 2012

Вот что я использовал, чтобы найти последний идентификатор в таблице.Если таблица пуста, идентификатор не будет возвращен.Если таблица заполнена, то мне нужен следующий идентификатор для новой записи.

ResultSet mn = stmt.executeQuery("SELECT MAX(ExamID)FROM ExamResults");

if (mn == null){
       jTextField1.setText("1");
} else{
       while (mn.next()) {

         int lastID =Integer.parseInt(""+(mn.getObject(1)));
         jTextField1.setText(""+(lastID+1));
       }
}
// close the objects

mn.close();
stmt.close();
conn.close();
0 голосов
/ 27 июля 2011

Как насчет этого?

SELECT IF EXISTS (SELECT * FROM USERS WHERE USERID=@UID) THEN 1 ELSE 0 END

или

SELECT IF(EXISTS (SELECT * FROM USERS WHERE USERID=@UID), 1, 0)

(я не уверен насчет настоящего синтаксиса здесь.)

0 голосов
/ 27 июля 2011
(rset.getString("date") == null)

должно быть

(!rset.next())

rset позиционируется «перед» первым полученным результатом.next () возвращает true, если был получен следующий результат.

Кроме того, какой тип данных является вашей переменной date?Нет гарантии, что date.toString () будет правильно форматировать дату для версии SQL для MS-Access.

Вместо этого подготовьте оператор

PreparedStatement ps = connetion.prepareStatement("SELECT * from table where date=?");

и установите дату как

ps.setDate(1, date);

затем выполните запрос, используя подготовленный оператор.

Это устраняет любые проблемы toString ().(Я не скомпилировал это, почти наверняка он не будет работать как есть, но идея есть).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...