#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. Спасибо, что помогли мне понять, что мне нужно было разобраться в этом.