samreen naveed Ответов: 2

Я получаю эту ошибку при создании резервной копии базы данных SQL в приведенном ниже коде .ошибка "com.microsoft.sqlserver.jdbc.sqlserverexception: незамкнутая кавычка после символьной строки 'sam22)'."


package dal;

import addofficer.bl.common.OfficerDTO;
import addofficer.bl.common.Response;
import java.sql.Connection;
import java.sql.Statement;

/**
 *
 * @author Harmeen
 */
public class DAL {
private ConnectionManager objDBConnection = new ConnectionManager("DESKTOP-19VP1EG\\SQLEXPRESS","addOfficer","host","tsoh123");    
            
            
    public Response saveOfficerInDB(OfficerDTO officerDTO) {
        Response objResponse = new Response();
        try{
            Connection objConnection = objDBConnection.getConnection();
            Statement stmt = objConnection.createStatement();                           
            String SQLInsertQuery = "Insert into officerdata(officerID,name,mobileNO,emailID) "
                    + "Values('"+officerDTO.officerID+"','"+officerDTO.name+"',"+officerDTO.mobileNO+",'"+officerDTO.emailID+")";            
            int recordsInserted = stmt.executeUpdate(SQLInsertQuery);
            Response objresponse = new Response();
            
             
            
            if(recordsInserted > 0)
                
            {
              objResponse.addInformationMessage("Record added successfully.");
            }
            else
            {
                objResponse.addInformationMessage("Failed to add officer in database.");
            }
            objConnection.close();
        }
        // Handle any errors that may have occurred.
        catch (Exception e) {
            e.printStackTrace();
            objResponse.AddErrorMessage("Failed to add Officer due to: "+e.getMessage());
        }
            return objResponse;
    }
        }


Что я уже пробовал:

пожалуйста, помогите мне решить эту ошибку

Richard MacCutchan

У вас есть непревзойденные символы кавычек в вашей строке. Посмотрите внимательно, и вы увидите, где они отсутствуют.

2 Ответов

Рейтинг:
12

Garth J Lancaster

Этот

String SQLInsertQuery = "Insert into officerdata(officerID,name,mobileNO,emailID) "
                    + "Values('"+officerDTO.officerID+"','"+officerDTO.name+"',"+officerDTO.mobileNO+",'"+officerDTO.emailID+")";  
это ужасный и неправильный способ построения запроса, 1) по той причине, которую вы показали - он подвержен ошибкам, 2) он допускает SQL-инъекцию .. пожалуйста, посмотрите java-способ выполнения параметризованного запроса в java

Вот одна ссылка, которая показывает, как правильно построить запрос Как исправить ошибку путем внедрения кода SQL с использованием Java-объект PreparedStatement &амп; задание callablestatement[^] и вот это Как Писать Параметризованные Запросы В Java[^] и, возможно, это http://tutorials.jenkov.com/jdbc/preparedstatement.html[^]


samreen naveed

хорошо спасибо

Рейтинг:
1

OriginalGriff

Проблема, которую вы заметили, объясняется в сообщении об ошибке - вам не хватает заключительной цитаты:

"Values('"+officerDTO.officerID+"','"+officerDTO.name+"',"+officerDTO.mobileNO+",'"+officerDTO.emailID+")"
                                                                                  ^   
             ^

Но это очень плохая идея. Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?