Недопустимое состояние курсора — нет текущей строки при вставке строки

#java #mysql #database

#java #mysql #База данных

Вопрос:

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

Недопустимое состояние курсора — нет текущей строки.

Вот мой код: он создает базу данных без проблем, но когда я пытаюсь вставить строку, я получаю сообщение об ошибке.

 package importtimesheet;

import java.io.IOException;
import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class ImportTimeSheet
{

    // JDBC driver name and database URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:derby://localhost:1527/PaperRoute";

    //  Database credentials
    static final String USER = "<username removed>";
    static final String PASS = "<password removed>";

    private static String buildit(String names, String types)
    {
        String[] na = names.split("t");
        String[] ta = types.split("t");
        String result = "CREATE TABLE HOURS_WORKED (";
        for (int i = 0; i < na.length; i  )
        {
            result = result   na[i]   " "   ta[i]   " not NULL,";
        }
        result = result   " PRIMARY KEY (DATE))";
        return resu<
    }

    public static void main(String[] args) throws IOException
    {
        boolean bon = false;
        String[] temp;
        String file_name = "C:\Users\Michael_2\Dropbox\Programming\Finished         Programs\ExportTimeSheet\data.txt";
        String[] aryLines = new String[0];
        //IMPORT DATA FROM FLAT FILE
        try
        {
            ReadFile file = new ReadFile(file_name);
            aryLines = file.OpenFile();

    //            for (int i = 0; i < aryLines.length; i  )
    //            {
    //                System.out.println(aryLines[i]);
    //            }
        } catch (IOException e)
        {
            System.out.println(e.getMessage());
        }
        String names = aryLines[0];
        String types = aryLines[1];

        //CREATE DB TABLE 
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs;

        try
        {
            //Register JDBC driver
            Class.forName("com.mysql.jdbc.Driver");

            //Open a connection
            System.out.println("Connecting to selected database...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            System.out.println("Connected to database successfully...");

            //Execute a query
            System.out.println("Creating table in database...");
            stmt = conn.createStatement();
            String sql = buildit(names, types);
            stmt.executeUpdate(sql);
            System.out.println("Created table in database...");
        } catch (SQLException se)
        {
            //Handle errors for JDBC
            se.printStackTrace();
        } catch (Exception e)
        {
            //Handle errors for Class.forName
            e.printStackTrace();
        } finally
        {
            //finally block used to close resources
            try
            {
                if (stmt != null)
                {
                    conn.close();
                }
            } catch (SQLException se)
            {
            }// do nothing
            try
            {
                if (conn != null)
                {
                    conn.close();
                }
            } catch (SQLException se)
            {
                se.printStackTrace();
            }//end finally try
        }//end try

        for (int i = 2; i < aryLines.length; i  )
        {
            System.out.println(aryLines[i]);
            temp = aryLines[i].split("t");
            if (temp[1] == "BON")
            {
                bon = true;
            }
            try
            {
                String host = "jdbc:derby://localhost:1527/PaperRoute";
                String uName = "<username removed>";
                String uPass = "<password removed>";
                Connection con;
                Statement stmnt;
                con = DriverManager.getConnection(host, uName,uPass);
                stmnt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,     ResultSet.CONCUR_UPDATABLE);
                String data = "SELECT * from HOURS_WORKED";
                rs = stmnt.executeQuery(data);

                Time arrived = java.sql.Time.valueOf(temp[2]);
                Time received = java.sql.Time.valueOf(temp[3]);
                Time left = java.sql.Time.valueOf(temp[4]);
                Time started = java.sql.Time.valueOf(temp[5]);
                Time finished = java.sql.Time.valueOf(temp[6]);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                java.util.Date parsed = sdf.parse(temp[0]);
                java.sql.Date sql = new java.sql.Date(parsed.getTime());
                String[] na = names.split("t");
                rs.moveToInsertRow();
                rs.updateDate(1, sql);
                rs.updateBoolean(2, bon);
                rs.updateTime(3, arrived);
                rs.updateTime(4, received);
                rs.updateTime(5, left);
                rs.updateTime(6, started);
                rs.updateTime(7, finished);
                rs.updateRow();
                System.out.println(sql);``
            } catch (ParseException pe)
            {
                System.out.println(pe.getMessage());
            } catch (SQLException se)
            {
                System.out.println(se.getMessage());
            }
        }
    }
}
  

Комментарии:

1. Можете ли вы опубликовать выданное исключение?

2. Его нет. Это фрагмент моего вывода: 2014-06-11 ср 02:40:00 02:45:00 03:55:00 04:05:00 06:35:00 Недопустимое состояние курсора — нет текущей строки. 2014-06-12 ЧТ 03:25:00 03:25:00 04:35:0004:50:00 07:00:00 Недопустимое состояние курсора — нет текущей строки. 2014-06-13 ПТ 02:25:00 02:30:00 03:45:00 04:00:00 06:40:00 Недопустимое состояние курсора — нет текущей строки. 2014-06-14 СБ 03:35:0003:40:00 04:55:00 05:05:00 07:35:00 Недопустимое состояние курсора — нет текущей строки. 2014-06-15 ВС 02:50:00 03:00:00 04:30:00 04:45:00 07:30:00 Недопустимое состояние курсора — неттекущая строка. СБОРКА ВЫПОЛНЕНА УСПЕШНО (общее время: 2 секунды)

3. Я попытался использовать System.out.println(«номер строки»), чтобы сузить область возникновения проблемы. Кажется, это строка rs.updateRow();

4. Я идиот, сообщение об исключении — недопустимое состояние курсора — нет текущей строки. Это исключение SQLException.

5. не будь таким суровым с самим собой, это происходит постоянно.

Ответ №1:

Я полагаю, вы что-то забыли в своем запросе,

 String data = "SELECT * from HOURS_WORKED";
  

должно быть

 String data = "SELECT * from HOURS_WORKED FOR UPDATE";
  

Комментарии:

1. Я никогда не видел этого раньше, и, похоже, это не имеет никакого эффекта. Однако я буду иметь это в виду. Это может быть частью головоломки.

Ответ №2:

Я, наконец, понял, что причина, по которой я получаю эту ошибку, заключается в том, что у меня был rs.updateRow(); где у меня должен был быть rs.insertRow(); Теперь, когда я внес исправление (наряду с другими изменениями, упомянутыми выше) Я больше не получаю сообщение об ошибке, но база данных не обновляется. Но я думаю, что это другая проблема.

Ответ №3:

Я не уверен, как это вообще работает; вы регистрируете драйвер mysql, но используете URL-адрес derby.

 static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:derby://localhost:1527/PaperRoute";
  

Возможно, вы хотите (для базы данных derby):

 static final String JDBC_DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
static final String DB_URL = "jdbc:derby://localhost:1527/PaperRoute";
  

или (для базы данных mysql):

 static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:1527/PaperRoute";
  

В зависимости от используемой базы данных.

Существуют также различные места, где вы «жестко кодируете» значения вместо использования этих констант.

Комментарии:

1. Я думаю, что здесь я ошибся. Я пытался объединить инструкции с двух разных веб-сайтов о том, как использовать базы данных. Я пытаюсь использовать базу данных в NetBeans. Я заметил, что один использовал derby, а другой mysql, но, не совсем понимая разницу, я просто попытался собрать что-то вместе.

2. Я немного почистил свой код. Я создал метод подключения, чтобы он находился в одном месте private static Connection connect() { String user = «<имя пользователя удалено>»; String password = «<пароль удален>»; String driver = «org.apache. derby.jdbc.EmbeddedDriver»; String url = «jdbc:derby://localhost:1527/PaperRoute»; Соединение con = null; попробуйте{con = DriverManager.getConnection(url, пользователь, пароль); }поймать (SQLException s) { } вернуть con; }

3. Оказывается, то, что я хотел, было файлом JAR. Спасибо, что помогли мне понять, что мне нужно было разобраться в этом.