2013-12-12 6 views
0

Проблема была: Не удается получить только что вставленные данные из таблицы. Из сообщения об ошибке видно, что он не видит первый столбец. Я знаю, что столбец есть, и данные были вставлены. Я проверил базу данных. Я проверил, имеет ли столбец Number скрытое пространство в имени. Нет, нет.не может получить данные из базы данных

Пробовал: Отладил каждую линию, и все было хорошо вместе с вводом данных в базу данных. Найдено вопрос почти в конце кода:

 rs1.next(); 
     String s1 = rs1.getString(1); 

Я попытался написать

 rs1.first(); 
     String s1 = rs1.getString(1); 

или

 rs1.first(); 
     String s1 = rs1.getString("Number"); 

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

package mypackage; 
    import java.sql.Connection; 
    import java.sql.DriverManager; 
    import java.sql.PreparedStatement; 
    import java.sql.ResultSet; 
    import java.sql.SQLException; 
    import java.sql.Statement; 
    import java.util.Collections; 
    import java.util.LinkedList; 
    import javax.ws.rs.GET; 
    import javax.ws.rs.Path; 
    import javax.ws.rs.PathParam; 
    import javax.ws.rs.QueryParam; 
    import javax.ws.rs.core.Response; 

    @Path("/query") 
    public class CList { 

     private LinkedList<SMember> contacts; 

     public CList() { 
     contacts = new LinkedList(); 
     } 

     @GET 
     @Path("/{CList}") 
     public Response addCLocation(@QueryParam("employeeId") String eId) throws SQLException{ 

      String dataSourceName = "DBname"; 
      String dbURL = "jdbc:mysql://localhost:3306/" + dataSourceName; 
      String result = ""; 
      Connection con = null; 
      PreparedStatement ps0 = null, ps = null; 
      ResultSet rs = null, rs1 = null; 
      String id = eId; 

      try { 
       try{ 
       //Database Connector Driver 
       Class.forName("com.mysql.jdbc.Driver"); 
       //Connection variables: dbPath, userName, password 
       con = (Connection)  
         DriverManager.getConnection(dbURL,"someusername","somepassword"); 
        System.out.println("We are connected to database"); 
        //SQL Statement to Execute 
        System.out.print(id); 
        s = con.prepareStatement("SELECT 1 FROM CList WHERE Number=?"); 
            s.setString(1, eId); 
        rs = s.executeQuery(); 
        //Parse SQL Response 
        if(!rs.next()) { 
         SMember sm = new SMember(); 
         ps = (PreparedStatement) con.prepareStatement("INSERT 
           INTO Contact_List (Number, First_Name, Last_Name, Phone_Number) " + 
       "VALUES (?,?,?,?)"); 
         ps.setString(1,sm.getEmployeeID()); 
         ps.setString(2,sm.getFirstName()); 
         ps.setString(3,sm.getLastName()); 
         ps.setString(4,sm.getPhone()); 
         ps.executeUpdate(); 
              ps = con.prepareStatement("SELECT Number, First_Name, 
               Last_Name, Phone_Number FROM CList 
               WHERE Number=" + eId); 
        rs1 = ps.executeQuery(); 
        while(rs1.next()){ 
         result = "[Added contact to contact list. 
                   Number: " + rs1.getString(1) + 
          "][First_Name: " + rs1.getString(2) + 
          "][Last_name: " + rs1.getString(3) + 
          "][Phone_Number: " + rs1.getString(4) + 
          "]\n"; 
        } 
        } 
        else { 
         result = "[Contact is already on the list]"; 
        } 
       } 
       catch(Exception e) { 
        System.out.println("Can not connect to database"); 
        e.printStackTrace(); 
       } 
       finally { 
        //Close Database Connection 
        ps0.close(); 
        ps.close(); 
        con.close();  
       } 
      } 
      catch(Exception e) { 
       System.out.println(e); 
      } 
      //Return the Result to Browser 
      return Response.status(1000).entity(result).build(); 
     } 

Таблица

enter image description here

1234 номер является уникальным, и это число, которое я хочу получить.

Вы видите номер должен быть уникальным. До сих пор я беру данные из класса SMember, и он всегда содержит те же данные. Цель моего вопроса - просто указать информацию, которую я вставил несколько секунд назад.

Также есть класс SMember, который я не размещал здесь, и в его конструкторе я инициализирую номер, имя, фамилию и номер телефона. Цель тестирования. Я сделал все рекомендованные изменения, но проблема остается прежней.

+0

PM 77-1 Как вы его отредактировали? Я не хочу делать такие же ошибки в будущем. – user1282256

ответ

1

Здесь есть несколько вопросов.

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

Посмотрите на эту строку кода:

ps = (PreparedStatement) con.prepareStatement("INSERT INTO CList (Number, First_Name, Last_Name, Phone_Number) VALUES ('"+sm.getEmployeeID()+"', '"+sm.getFirstName()+"', '"+sm.getLastName()+"', '"+sm.getPhone()+"')", Statement.RETURN_GENERATED_KEYS); 

Вы позже хотите получить значение в Number столбца в качестве сгенерированного ключа. Однако вы передаете значение для этого столбца, а именно возвращаемое значение sm.getEmployeeID(). Если вы передадите значение, оно не будет генерироваться (если предположить, что этот столбец определен в базе данных с автоматическим приращением.

Исправление этого, однако, не решит все, так как в вашем коде есть много проблем. те, я могу прямо определить:

  • вы инициализировать переменные см, создавая новый объект Но вы по-прежнему не имеете значения для работника идентификатор, фамилии, имени или номера телефона, как вы нигде не установить эти значения. sm (или вы делаете это в конструкторе по умолчанию?)
  • Вы пытаетесь использовать подготовленное утверждение, это хорошо, но вы на самом деле этого не делаете, это очень плохо, так как это Пенистая площадка для SQL-инъекции. Вместо создания строки запроса, как вы делаете, вы должны использовать фиксированную строку, например, INSERT INTO CList (Number, First_Name, Last_Name,Phone_Number) VALUES (?,?,?,?), а затем установить значения в инструкции перед ее выполнением. Таким образом, никто не может связываться с вашей базой данных через этот оператор (прочитайте об инъекции SQL, просто перейдите к нему, чтобы увидеть проблему, которую вы представите).
  • Ваш идентификатор сотрудника представляется параметром eId вашего метода. Вы должны использовать это также в своем заявлении select, чтобы узнать, находится ли он уже в вашей базе данных (здесь также используется подготовленный оператор) и в вашем заявлении insert позже, когда идентификатор еще не находится в базе данных.
  • Если вы проверяете определенный идентификатор, тогда вставьте этот конкретный идентификатор, совершенно бесполезно извлекать некоторый сгенерированный идентификатор. Вы уже определили свой уникальный идентификатор. Используйте это!

Редактировать: Поскольку ваш код является беспорядочным, я немного очистил этот материал и исправил проблемы, которые я мог найти непосредственно.Проверьте, не помогает ли это вам:

public Response addCLocation(String eId) throws SQLException { 

    String dataSourceName = "DBname"; 
    String dbURL = "jdbc:mysql://localhost:3306/" + dataSourceName; 
    String result = ""; 
    Connection con = null; 
    Statement s = null; 
    PreparedStatement ps = null; 
    ResultSet rs = null, rs1 = null; 
    String id = eId; 

    try { 
     try { 
     // Database Connector Driver 
     Class.forName("com.mysql.jdbc.Driver"); 
     // Connection variables: dbPath, userName, password 
     con = DriverManager.getConnection(dbURL, "someusername", "somepassword"); 
     System.out.println("We are connected to database"); 
     s = con.createStatement(); 
     // SQL Statement to Execute 
     System.out.print(id); 
     PreparedStatement alreadyThere = con.prepareStatement("SELECT 1 FROM CList WHERE Number = ?"); 
     alreadyThere.setString(1, eId); 
     System.out.println("0"); 
     // Parse SQL Response 
     int i = 0; 
     if (rs.next() == false) { 
      SMember sm = new SMember(); 
      ps = con 
       .prepareStatement("INSERT INTO Contact_List (Number, First_Name, Last_Name, Phone_Number) VALUES (?,?,?,?)"); 
      ps.setString(1, sm.getEmployeeID()); 
      ps.setString(2, sm.getFirstName()); 
      ps.setString(3, sm.getLastName()); 
      ps.setString(4, sm.getPhone()); 
      ps.executeUpdate(); 
     } 
     else { 
      result = "[Contact is already on the list]"; 
     } 
     } 
     catch (Exception e) { 
     System.out.println("Can not connect to database"); 
     e.printStackTrace(); 
     } 
     finally { 
     // Close Database Connection 
     s.close(); 
     ps.close(); 
     con.close(); 
     } 
    } 
    catch (Exception e) { 
     System.out.println(e); 
    } 
    // Return the Result to Browser 
    return Response.status(200).entity(result).build(); 
    } 
+0

В моем отредактированном сообщении я внесла все необходимые изменения. Я все еще хочу получить то, что сгенерировало его, чтобы знать, как это работает. Он по-прежнему дает мне такую ​​же ошибку и хотел бы знать, как ее решить. Я также попытаюсь использовать последний пункт из ваших рекомендаций. – user1282256

+0

Вы не выполнили все необходимые изменения. В вашем чеку по-прежнему не используется параметр id, а строка 'id'. Вы должны использовать подготовленную инструкцию для предотвращения внедрения sql. А также вы по-прежнему пытаетесь читать генерируемые идентификаторы, которые никогда не генерируются, пока вы все еще имеете идентификатор, уже переданный вам в качестве параметра для вашего метода 'addCLocation'. – Matthias

+0

Добавлен пример кода, который действительно вносит необходимые изменения. Проверьте это, если он приближается к тому, что вам действительно нужно. – Matthias

0

"SELECT 1 FROM CList WHERE Number = 'ID'"

Похоже, вы пытаетесь на самом деле выбрать записи, где числовое значение 'идентификатор'. Это может вызвать ошибку при попытке выполнить команду «rs.next()» на пустом наборе результатов. Вы вместо этого пытаетесь сделать что-то вроде

«ВЫБЕРИТЕ 1 ОТ КЛИСТА ГДЕ« = = ». Я бы . "'"? Где «id» - переменная?

+0

id - уникальный employeeId – user1282256

1

Вы получаете эту ошибку, потому что ваш первый запрос неверен, он возвращает пустой набор результатов.

Во-первых,

rs = s.executeQuery("SELECT 1 FROM CList WHERE Number='id'"); 

выше строка в коде, не исправить это должно быть так:

**rs = s.executeQuery("SELECT 1 FROM CList WHERE Number="+id);** 

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

Во-вторых, существует проблема в следующем коде

if(rs.next() == false) { 
        SMember sm = new SMember(); 
        ps = (PreparedStatement) con.prepareStatement("INSERT 
             INTO CList (Number, First_Name, Last_Name, 
             Phone_Number) VALUES ('"+sm.getEmployeeID()+"', 
             '"+sm.getFirstName()+"', '"+sm.getLastName()+"', 
               '"+sm.getPhone()+"')", 
            Statement.RETURN_GENERATED_KEYS); 
        ps.executeUpdate(); 

В приведенном выше коде, вы должны инициализировать SMember, объект в настоящее время в запросе они собираются в нуль также при использовании PreparedStatement вы должны использовать запрос как это:

**ps = (PreparedStatement) con.prepareStatement("INSERT INTO CList (Number, First_Name, Last_Name,Phone_Number) VALUES (?,?,?,?)",Statement.RETURN_GENERATED_KEYS); 
ps.setString(1,sm.getEmployeeID()); 
ps.setString(2,sm.getFirstName()); 
ps.setString(3,sm.getLastName()); 
ps.setString(4,sm.getPhoneNumber());** 
+0

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

+0

Данные будут вставлены, потому что это проверка состояния неправильно если (rs.next() == ложь) Это должно быть написано, как этот если (rs.next()) В этом случае если блок не будет работать и логически никакая запись не будет вставлена. Поскольку в соответствии с вашим кодом вы извлекаете запись из базы данных для идентификатора, который вы получаете из параметра функции. –

+0

Вы имеете в виду это условие if (rs.next() == false)? если rs.next() не может найти искомый идентификатор, он вернет false, потому что id отсутствует. он пытается выбрать идентификатор сотрудника. executeQuery возвращает resultSet, но никогда не имеет значения null. – user1282256

1

оператор запроса может быть вопрос "SELECT 1 FROM CList WHERE Number = 'ID'", в заявлении выберите ваш идентификатор берется как String.we нужно заменить значение.

-> Попробуйте, как это { "SELECT 1 FROM CList WHERE Number =" + идентификатор},

-> Еще одна вещь "выберите 1 из имени таблицы" не будет печатать 1 для строк не воспользоваться для ваше состояние.

Так мое предложение

{"SELECT * FROM CList WHERE Number="+id} 

попробовать это !!

+0

Я тоже пробовал этот, но он работает одинаково. Перед отправкой кода я сделал заявления на печать, и первый запрос работал хорошо. – user1282256

Смежные вопросы