Не заполняются Blob поля в IBQuery

Soonway
Дата: 09.05.2011 01:45:06
InterBase. Delphi.
Уважаемые эксперты, помогите чайнику!
При добавлении записи в IBQuery через SQL вся запись добавляется, а BLOB поля остаются пустыми. Вернее даже так. При добавлении первой записи, заполняются, а при попытке добавит/изменить вторую запись - облом.
Создание запроса:
IF Edit5.Text <> '' THEN
begin
DataModule2.IBQuery8.Params.CreateParam(ftBlob, 'BLB', ptInput);
DataModule2.IBQuery8.ParamByName('BLB').LoadFromFile('D:\BD\vinogradov\'+Edit5.Text+'.bmp', ftBlob);
end;
IF Edit6.Text <> '' THEN
begin
DataModule2.IBQuery8.Params.CreateParam(ftBlob, 'TXT', ptInput);
DataModule2.IBQuery8.ParamByName('TXT').LoadFromFile('D:\BD\vinogradov\'+Edit6.Text+'.rtf', ftBlob);
end;
Zapros:=Name_SQL+ TBL +  ' VALUES (GEN_ID(N_PRISTS,1)'+' , '+#39+ Edit2.Text +#39 + ' , ' + Edit3.Text  + ' ,' + Edit4.Text  + ' , ' 
+  ':BLB1' + ' , ' +':TXT' + ' , ' + 'GEN_ID(N_PRISTS,0)'  + ' , ' + #39 + Edit5.Text + #39 + ' , ' + #39 + Edit6.Text + #39 + ');' ;
Обработчик кнопки выполнения:
procedure TForm1.Button3Click(Sender: TObject);
begin

 IF DataModule2.IBTransaction1.InTransaction = true THEN
 DataModule2.IBTransaction1.Commit;
DataModule2.IBDataBase1.Open;
DataModule2.IBQuery8.SQL.Clear; 
WITH DataModule2.IBTransaction1 DO
  begin
  TRY
  StartTransaction;
  //DataModule2.InsertQuery.Close;

  DataModule2.IBQuery8.SQL:=ListBox1.Items;
 // DataModule2.insertQuery.Prepare;
  //DataModule2.InsertQuery.Open;
  DataModule2.IBQuery8.ExecSQL;
  CommitRetaining;
  EXCEPT
  ShowMessage('Изменения не приняты');
  RollbackRetaining;

  end;
  end;

 
DataModule2.IBQuery1.Close;
DataModule2.IBQuery1.Open;
DataModule2.IBQuery2.Close;
DataModule2.IBQuery2.Open;
DataModule2.IBQuery3.Close;
DataModule2.IBQuery3.Open;
DataModule2.IBQuery4.Close;
DataModule2.IBQuery4.Open;
DataModule2.IBQuery5.Close;
DataModule2.IBQuery5.Open;
DataModule2.IBQuery6.Close;
DataModule2.IBQuery6.Open;


end;
ДжекНепотрошитель
Дата: 09.05.2011 02:15:37
Даже не знаю, можно ли тебе помочь. Сегодня удивительный день - я увидел второго программиста подряд, код которого вызывает непреодолимое желание убить автора как-нибудь мучительнее.
Soonway
Дата: 09.05.2011 02:27:03
Что стало с первым?
Soonway
Дата: 09.05.2011 02:27:49
Помощь нужна очень. Уже все перепробовал(
Soonway
Дата: 09.05.2011 12:43:33
Люди, пожалуйста, помогите!
Кроик Семён
Дата: 09.05.2011 14:24:12
Soonway,

у меня некоторые размышления при чтении кода

читаю:
IF Edit5.Text <> '' THEN
begin
DataModule2.IBQuery8.Params.CreateParam(ftBlob, 'BLB', ptInput);
DataModule2.IBQuery8.ParamByName('BLB').LoadFromFile('D:\BD\vinogradov\'+Edit5.Text+'.bmp', ftBlob);
end;
1) это для меня означает, в том числе, что параметр :BLB может и не создаться/инициализироваться, если Edit5.Text = ''
2) аналогично и с параметром :ТХТ если Edit6.Text = ''

далее, формирование строки "Zapros":
Zapros:=Name_SQL+ TBL +  ' VALUES (GEN_ID(N_PRISTS,1)'+' , '+#39+ Edit2.Text +#39 + ' , ' + Edit3.Text  + ' ,' + Edit4.Text  + ' , ' 
+  ':BLB1' + ' , ' +':TXT' + ' , ' + 'GEN_ID(N_PRISTS,0)'  + ' , ' + #39 + Edit5.Text + #39 + ' , ' + #39 + Edit6.Text + #39 + ');' ;
что я вижу:

1) параматры :BLB и :ТХТ вписаны статически в строку запроса, независимо от того, были ли они ранее созданы (CreateParam) и инициализированы (LoadFromFile)
2) плюс, что удивляет, вместо :BLB вижу :BLB1
Кроик Семён
Дата: 09.05.2011 14:35:03
P.S.
и еще совет, как сделать код лучше (к вопросу не относится)


1) Edit1, Edit2, ...., Edit1000, когда их имена используются в коде, это очень плохо.
Дай им нормальные имена. Типа edStreet, edName, edPrice ...

2) #39 это тоже некрасиво. Используй QuotedStr(edSomething.Text) вместо #39+edSomething.Text+#39
Hо еще лучше уйти и от этого в пользу параметров
Кроик Семён
Дата: 09.05.2011 14:39:41
P.P.S.
Zapros:= ............ + ');' ;

Не знаю, но думаю что точка-с-запятой ";" в конце это лишнее.
Хотя могу в случае с InterBase и ошибаться
Soonway
Дата: 09.05.2011 15:13:37
точка с запятой в конце должна быть, параметр поправил, та же хрень. Одна запись( первая ) заполняется , после этого провал. Может с транзакцией че не так?
Кроик Семён
Дата: 09.05.2011 15:17:01
А как остальные мои советы из 1-го поста?