Delphi SQL, как добавить данные в конкретную запись в таблице базы данных MS Access - PullRequest
0 голосов
/ 05 октября 2018

Я занят созданием важного ИТ-проекта для своего класса и изо всех сил пытаюсь добиться успеха с помощью этой одной проблемы.

Программа должна сохранять изображения в таблице базы данных, но я пытаюсь использоватьдругая техника.Когда пользователь использует элемент управления «loadfromfile», вместо сохранения самого изображения в базе данных используется каталог с именем файла.Итак, у меня в таблице есть поле с именем «Каталог», которое только читает строку, и я сохраняю путь к имени файла в это поле, например «C: /Pictures/Picture.JPG» и т. Д.

Iиспользуйте sName для edit.text, чтобы позволить пользователю найти конкретную запись, чтобы сохранить путь к полю.И sDirectory для самого имени пути.

Я использую таблицу базы данных MS Access.В полях таблицы: (идентификатор, настоящее имя, фамилия, пароль, возраст, каталог, носитель, местоположение, название обложки)

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

Синтаксическая ошибка (отсутствует оператор) в выражении запроса 'Имя пользователя =' Имя 'Вставить (каталог) Значения (?)'

procedure TfrmPost.btnBrowseClick(Sender: TObject);
begin

opdImage.Execute;
sDirectory := opdImage.FileName;
MyPic.Picture.LoadFromFile(sDirectory);
bitBtnUpload.Enabled := true;

end;

procedure TfrmPost.bitBtnUploadClick(Sender: TObject);

begin
 sName := lblName.Caption;
 sDirectory := QoutedStr(opdImage.Filename);

  with dmArt do
    begin
      qryArt.Close;
      qryArt.SQL.Clear;
      qryArt.SQL.Text := 'SELECT * FROM tbArt WHERE Username = '''+sName + ''' '; 
       qryArt.Open;
       qryArt.SQL.Add('Insert');
       qryArt.SQL.Add('(Directory)');
       qryArt.SQL.Add('Values (:Directory)');
       qryArt.Parameters.ParamByName('Directory').Value := sDirectory;
       qryArt.ExecSQL;
       qryArt.Close;

        end;

        end;

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Прекратить объединение SQL.Он оставляет вас открытыми для атак с использованием SQL-инъекций и очень усложняет задачу при попытке правильно заключить строки в кавычки или получить правильные форматы даты.Вместо этого используйте параметры SQL и используйте оператор UPDATE с предложением WHERE.Вы также можете легко проверить успех или неудачу.

procedure TfrmPost.bitBtnUploadClick(Sender: TObject);
begin
  with dmArt do
  begin
    qryArt.Close;
    qryArt.SQL.Text := 'UPDATE tbArt SET Directory = :Directory'#13 +
                       'WHERE UserName := :UserName';
    qryArt.Parameters.ParamByName('UserName').AsString := lblName.Caption;
    qryArt.Parameters.ParamByName('Directory').AsString := opdImage.FileName;
    if qryArt.ExecSQL <> 1 then
      raise Exception.Create('UPDATE failed. Is username correct?');
  end;
end;

Кроме того, ваш код для получения имени файла не очень хорошо разработан.Он неправильно обрабатывает пользователь, отменяющий диалог выбора файла.Попробуйте что-то вроде этого:

procedure TfrmPost.btnBrowseClick(Sender: TObject);
begin
  if opdImage.Execute then
  begin
    MyPic.Picture.LoadFromFile(opdImage.FileName);
    bitBtnUpload.Enabled := True;
  end;
end;
0 голосов
/ 05 октября 2018

Insert INTO tbArt - это то, что вы ищете, чтобы исправить ошибку.

Это если вы хотите вставить значение sDirectory непосредственно в базу данных.

Похоже, вы думаете, чтовставка произойдет в qryArt.Это не будет делать это.Вы хотите

qryArt.Edit; 
qryArt.FieldByName('directory').AsString := sDirectory; 
qryArt.Post;

, если хотите редактировать значение поля каталога в текущей записи.Это также может (не) редактировать значение в базе данных.Все зависит от того, какой компонент qryArt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...