2017-02-21 4 views
0

Я пишу простую программу с использованием UDP-сокетов. Мне нужно ввести имя пациента и получить его данные из базы данных. Имя пациента вводится в класс Доктора и отправляется в класс сервера. Затем класс сервера выполняет запрос для извлечения деталей пациента. Проблема заключается в инструкции SQL. Когда я использовал только переменную firstname, она работает нормально, но когда я ставлю вторую переменную lastname, переменная PatientRecord имеет значение NULL.Операция Java SQL Select с использованием нескольких переменных в предложении WHERE

Класс сервера:

public class Server { 

    public static Connection con; 

    public static String PatientRecords; 

    public static String QueryPatientInfo(String PatientDetails) throws SQLException { 

     System.out.print("\nNew Patient query received:\n"); 

     String [] PatientDetArray = PatientDetails.split(","); 

     String firstname,lastname; 

     firstname = PatientDetArray[1]; 
     lastname = PatientDetArray[2]; 

     System.out.println("First Name: "+ firstname); 
     System.out.println("Last Name: "+ lastname); 

     Statement query = con.createStatement(); 

     query.execute("SELECT * FROM patient WHERE FirstName = '"+firstname+"' AND LastName = '"+lastname+"' "); 

     ResultSet rs = query.getResultSet(); 

     String sex; 
     String dob ; 
     String address ; 
     String occupation; 
     String phoneno ; 


     if(rs != null){ 

      while (rs.next()){ 

       sex = rs.getString("Sex"); 
       dob = rs.getString("DOB"); 
       address = rs.getString("Address"); 
       occupation = rs.getString("Occupation"); 
       phoneno = rs.getString("PhoneNo"); 

       PatientRecords = sex + "," + dob + "," + address + "," + occupation + "," + phoneno; 
      } 

      System.out.print("Patient records successfully retrieved from database !\n\n"); 

      return PatientRecords; 
     } 

     else { 

      System.out.print("Error occurred patient records not found !\n\n"); 

      return "Error occurred patient records not found !"; 
     } 

    } 

    public static void main(String[] args) throws IOException, SQLException { 

     // Connecting to database - using xampp 

     try 
     { 
      Class.forName("com.mysql.jdbc.Driver"); 
      con = DriverManager.getConnection("jdbc:mysql://localhost/patientrecord", "root", ""); 
      System.out.println("Database is connected !"); 

     } 
     catch(Exception e) 
     { 
      System.out.println("Database connection error: " + e); 
     } 

     DatagramSocket serverSocket = new DatagramSocket(8008); 

     byte[] receiveData = new byte[1024]; 

     byte[] sendData; 

     System.out.println("Server ready and waiting for clients to connect..."); 

     while (true) { 

      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 

      serverSocket.receive(receivePacket); 

      String PatientDetails = new String(receivePacket.getData()); 

      String message; 

      message = QueryPatientInfo(PatientDetails); 

      System.out.print(message); 

      InetAddress IPAddress = receivePacket.getAddress(); 

      int port = receivePacket.getPort(); 

      sendData = message.getBytes(); 

      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); 

      serverSocket.send(sendPacket); 

     } 
    } 

} 

Доктор Класс:

public class Doctor { 

    public static void main(String[] args) throws IOException { 


     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 

     DatagramSocket clientSocket = new DatagramSocket(); 

     InetAddress IPAddress = InetAddress.getByName("localhost"); 

     // Creating array of bytes to send and receive packet 
     byte[] sendData; 

     byte[] receiveData = new byte[1024]; 

     String request,firstName,lastName; 

     request = "query"; 

     System.out.print("Patient Registration"); 

     System.out.print("\n\nEnter Patient Details:\n"); 

     // User input 
     System.out.print("First name: \n"); 

     firstName= inFromUser.readLine(); 

     System.out.print("Last name: \n"); 
     lastName = inFromUser.readLine(); 

     String PatientDetails = request + ","+ firstName + "," +lastName; 

     sendData = PatientDetails.getBytes(); 

     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,IPAddress, 8008); 

     // Send data packet to server 
     clientSocket.send(sendPacket); 

     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 

     //Receive data packet from server 
     clientSocket.receive(receivePacket); 

     String PatientRecords = new String(receivePacket.getData()); 

     //System.out.print(PatientRecords); 

     String [] PatientDetArray = PatientRecords.split(","); 

     String sex,dob,address,occupation,phoneno; 

     sex = PatientDetArray[0]; 
     dob = PatientDetArray[1]; 
     address = PatientDetArray[2]; 
     occupation = PatientDetArray[3]; 
     phoneno = PatientDetArray[4]; 

     System.out.println("FROM SERVER: "); 

     System.out.println("Details for patient : " + firstName + " " + lastName); 
     System.out.println("Sex: " + sex); 
     System.out.println("Date of birth: " +dob); 
     System.out.println("Address: " + address); 
     System.out.println("Occupation: " + occupation); 
     System.out.println("Phone number: " + phoneno); 

     clientSocket.close(); 

    } 

} 
+0

Содержит ли первое и последнее имя запись в базе данных? – brso05

+0

Да, конечно, когда я пишу имя в самом SQL как это: «SELECT * FROM patient WHERE FirstName = 'david' AND LastName = 'john'"); он отлично работает. Когда я использовал переменную firstname, она работает. Только при использовании обеих переменных он не работает – Elliott08

+0

что 'System.out.println (« Имя: »+ первое имя); System.out.println («Фамилия:« + последнее имя »);' print copie за точным результатом –

ответ

1

Это может произойти, когда ваша строка есть Spaces так, чтобы избежать этой ситуации, вы можете использовать trim() так:

query.execute("SELECT * FROM patient WHERE FirstName = '" + firstname.trim() + 
       "' AND LastName = '" + lastname.trim() + "' "); 

Ваш способ установить переменные не крепят это может сделать ошибку синтаксиса или привести к SQL-инъекции так предлагает использовать Prepapred Statement, этот способ является более безопасным, так что вместо этого вашего запроса вы можете использовать:

PreparedStatement preparedStatement = connection.prepareCall("SELECT * FROM patient WHERE FirstName = ? AND LastName = ? "); 
preparedStatement.setString(1, firstname.trim()); 
preparedStatement.setString(2, lastname.trim()); 
ResultSet result = preparedStatement.executeQuery(); 

Надеется, что это может работать с вами.

+0

Спасибо !!!! Я использую trim(), и он работает !!! Однако я не понимаю, почему это необходимо, потому что в именах нет пробелов. – Elliott08

+0

добро пожаловать @ Elliott08 –

0

Это явно означает, что ваш WHERE состояние, как показано ниже, не соответствующий какому-либо записи и, таким образом, нет записей неправдоподобным. Попробуйте запустить запрос непосредственно в SQL и посмотреть, сколько записей вы получите. Или попробуйте изменить условие от AND до OR, и это должно дать вам представление.

WHERE FirstName = '"+firstname+"' AND LastName = '"+lastname+"' 

BTW, ваш код открыт для SQL Injection и, таким образом, рассмотреть возможность использования параметризованных запросов вместо.

+0

запрос возвращает хороший результат, когда имя вводится вручную следующим образом: WHERE FirstName = 'david' AND LastName = 'john' – Elliott08