Мне было трудно это понять. Сначала у меня есть метод insertProduct(Product p)
, который должен проверить, существует ли продукт с указанным кодом в базе данных. Если это так, этот метод отобразит сообщение об ошибке. В противном случае он должен добавить продукт в базу данных и распечатать его на консоли. Я не уверен, правильно ли я это делаю.Исключение Java SQL Неверное состояние курсора - нет текущей строки
Во-вторых, метод deleteProduct(Product p)
должен удалить продукт, который был добавлен методом insertProduct
. Теперь дело в том, что я продолжаю получать исключение SQL при попытке добавить продукт, а затем метод просто продолжает удалять продукты, которые находятся в базе данных один за другим, каждый раз, когда программа запускается до тех пор, пока не останется. Я не уверен, что не так с обоими этими методами.
Консоль вывода:
Derby has been started.
Product list:
bvbn Murach's Beginning Visual Basic .NET $49.50
cshp Murach's C# $49.50
java Murach's Beginning Java $49.50
jsps Murach's Java Servlets and JSP $49.50
mcb2 Murach's Mainframe COBOL $59.50
sqls Murach's SQL for SQL Server $49.50
zjcl Murach's OS/390 and z/OS JCL $62.50
First product:
bvbn Murach's Beginning Visual Basic .NET $49.50
Last product:
zjcl Murach's OS/390 and z/OS JCL $62.50
Product by code: cshp
cshp Murach's C# $49.50
Insert test:
java.sql.SQLException: Invalid cursor state - no current row.
Product list:
bvbn Murach's Beginning Visual Basic .NET $49.50
cshp Murach's C# $49.50
java Murach's Beginning Java $49.50
jsps Murach's Java Servlets and JSP $49.50
mcb2 Murach's Mainframe COBOL $59.50
sqls Murach's SQL for SQL Server $49.50
zjcl Murach's OS/390 and z/OS JCL $62.50
Delete test:
zjcl Murach's OS/390 and z/OS JCL $62.50
Product list:
bvbn Murach's Beginning Visual Basic .NET $49.50
cshp Murach's C# $49.50
java Murach's Beginning Java $49.50
jsps Murach's Java Servlets and JSP $49.50
mcb2 Murach's Mainframe COBOL $59.50
sqls Murach's SQL for SQL Server $49.50
Derby has been shut down.
Код:
import java.sql.*;
public class DBTesterApp
{
private static Connection connection = null;
private static Product p = null ;
public static void main(String args[])
{
// get the connection and start the Derby engine
connection = MurachDB.getConnection();
if (connection != null)
System.out.println("Derby has been started.\n");
// select data from database
printProducts();
printFirstProduct();
printLastProduct();
printProductByCode("cshp");
// modify data in the database
p = new Product("test", "Test Product", 49.50);
insertProduct(p);
printProducts();
deleteProduct(p);
printProducts();
// disconnect from the database
if (MurachDB.disconnect())
System.out.println("Derby has been shut down.\n");
}
public static void printProducts()
{
// Product p = null ;
try (Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery("SELECT * FROM Products"))
{
System.out.println("Product list:");
while(rs.next())
{
String code = rs.getString("ProductCode");
String description = rs.getString("Description");
double price = rs.getDouble("Price");
p = new Product(code, description, price);
printProduct(p);
}
System.out.println();
}
catch(SQLException e)
{
e.printStackTrace(); // for debugging
}
}
public static void printFirstProduct()
{
try(Statement statement = connection.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = statement.executeQuery("SELECT * FROM Products")){
System.out.println("First product:");
rs.first();
rs.last();
if(rs.isFirst() == false){
rs.previous();
}
if(rs.isLast() == false){
rs.next();
}
rs.absolute(1);
String code = rs.getString(1);
String description = rs.getString(2);
double price = rs.getDouble(3);
p = new Product(code , description , price);
printProduct(p);
System.out.println();
}
catch(SQLException e){
e.printStackTrace();
}
}
public static void printLastProduct()
{
try(Statement statement = connection.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = statement.executeQuery("SELECT * FROM Products")){
System.out.println("Last product:");
rs.first();
rs.last();
if(rs.isFirst() == false){
rs.previous();
}
if(rs.isLast() == false){
rs.next();
}
rs.absolute(7);
String code = rs.getString(1);
String description = rs.getString(2);
double price = rs.getDouble(3);
p = new Product(code, description, price);
printProduct(p);
System.out.println();
}
catch(SQLException e){
e.printStackTrace();
}
}
public static void printProductByCode(String productCode)
{
String sql =
"SELECT ProductCode, Description, Price " +
"FROM Products " +
"WHERE ProductCode = ?";
try(PreparedStatement ps = connection.prepareStatement(sql);){
ps.setString(1, productCode);
ResultSet rs = ps.executeQuery();
if(rs.next()){
String description = rs.getString("Description");
double price = rs.getDouble("Price");
p = new Product(productCode, description, price);
System.out.println("Product by code: " + productCode);
printProduct(p);
}
else{
rs.close();
}
}
catch(SQLException e){
System.err.println(e);
}
System.out.println();
}
public static void insertProduct(Product p)
{
System.out.println("Insert test: ");
//check if product code exists in database
try(Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery("SELECT * FROM Products")){
String code = rs.getString(1);
if (p.getCode().equals(code)){
System.out.println("Error: This product is already in the database!");
}
else{
String sql =
"INSERT INTO Products (productCode, Description, Price) " +
"VALUES (?, ?, ?)";
try(PreparedStatement ps = connection.prepareStatement(sql)){
ps.setString(1, p.getCode());
ps.setString(2, p.getDescription());
ps.setDouble(3, p.getPrice());
ps.executeUpdate();
}
catch(SQLException e){
System.err.println(e);
}
} //end else
printProduct(p);
System.out.println();
}//end try
catch(SQLException e){
System.out.println(e);
}
}
private static void deleteProduct(Product p)
{
System.out.println("Delete test: ");
String sql = "DELETE FROM Products " +
"WHERE ProductCode = ?";
try(PreparedStatement ps = connection.prepareStatement(sql)){
ps.setString(1, p.getCode());
ps.executeUpdate();
}
catch(SQLException e){
System.err.println(e);
}
// add code that deletes the specified product from the database
// if a product with the specified code doesn't exist, display an error message
printProduct(p);
System.out.println();
}
// use this method to print a Product object on a single line
private static void printProduct(Product p)
{
String productString =
StringUtils.padWithSpaces(p.getCode(), 8) +
StringUtils.padWithSpaces(p.getDescription(), 44) +
p.getFormattedPrice();
System.out.println(productString);
}
}
Я попробовал это, но теперь я получаю это: 'java.sql.SQLSyntaxErrorException: Колонка«TEST»либо не в какой-либо таблицы в ОТ список или отображается в спецификации соединения и выходит за рамки спецификации соединения или появляется в предложении HAVING и не находится в списке GROUP BY. Если это инструкция CREATE или ALTER TABLE, тогда «TEST» не является столбцом в целевой таблице. « – oxxi
Вот как я изменил метод: http://pastebin.com/wPBq0Jpf – oxxi
Вы все еще пропустили удаление' rs .getString (1); '. Это просто выше, где вы добавили 'rs.next()'. Проверка остальных. –