Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.04.2010, 15:48
Аватар для Dead_Gigabit
Dead_Gigabit Dead_Gigabit вне форума
Начинающий
 
Регистрация: 20.10.2009
Адрес: Там где холодно и сыро.... брр
Сообщения: 135
Версия Delphi: Delphi XE
Репутация: 10
Вопрос Копирование в пределах одной таблицы

Задача такая есть база в MS Access нашел исходник который копирует запись:

Код:
var
  i: Cardinal;
  srcStream: TBlobStream;
begin
  try
    with datamodule4.ADOTable1 do
    begin
      CheckBrowseMode;
      if EOF or BOF then
        raise Exception.Create('Разместите курсор на правильной строке');
    end;
    with datamodule4.ADOTable2 do
    begin
      Append;
      for i := 0 to datamodule4.ADOTable1.FieldCount - 1 do
        if datamodule4.ADOTable1.Fields[i].DataType < ftBytes then
          FieldByName(datamodule4.ADOTable1.Fields[i].FieldName).Assign(datamodule4.ADOTable1.Fields[i])
        else
        try
          srcStream := nil;
          srcStream := TBlobStream.Create(TBlobField(datamodule4.ADOTable1.Fields[i]), bmRead);
          TBlobField(FieldByName(datamodule4.ADOTable1.Fields[i].FieldName)).LoadFromStream(srcStream);
        finally
          if Assigned(srcStream) then
            srcStream.Free;
        end;
      Post;
      datamodule4.ADOtable1.Active:=false;
      datamodule4.ADOtable1.Active:=true;
    end;
     except
    on E: EDBEngineError do
      MessageDlg(E.Message, mtError, [mbOk], 0);
    on E: Exception do
      MessageDlg(E.Message, mtError, [mbOk], 0);
  end;
 end;
прогга компилиться ,но при копировании запись ругаеться на строку (выдилил красным)
выводит ошибку:
First chance exception at $7C81EB33. Exception class EInvalidCast with message 'Invalid class typecast'. Process Project1.exe (2712)

в чем моя ошибка подскажите пожалуйста...
Ответить с цитированием
  #2  
Старый 14.04.2010, 17:03
Аватар для Dead_Gigabit
Dead_Gigabit Dead_Gigabit вне форума
Начинающий
 
Регистрация: 20.10.2009
Адрес: Там где холодно и сыро.... брр
Сообщения: 135
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

Ну что не кто не может помочь что-ли....????
Ответить с цитированием
  #3  
Старый 14.04.2010, 17:30
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А вы уверены, что у вас точно blob поле попадает в ваше условие?
Не нравится мне такая запись:
Код:
if datamodule4.ADOTable1.Fields[i].DataType < ftBytes then
...
        else
потенциально туда может попасть все что после ftBytes
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 14.04.2010, 18:04
Аватар для Dead_Gigabit
Dead_Gigabit Dead_Gigabit вне форума
Начинающий
 
Регистрация: 20.10.2009
Адрес: Там где холодно и сыро.... брр
Сообщения: 135
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

хм незнаю этот исход работает с простым table1 а с ADO не хочет...
Может вы подскажите другой метод копирования?
Ответить с цитированием
  #5  
Старый 14.04.2010, 19:25
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Самое очевидное воспозоваться запросом на вставку записи.
Код:
insert into UserTable from select * from UserTable where id=10
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 15.04.2010, 17:25
Аватар для Dead_Gigabit
Dead_Gigabit Dead_Gigabit вне форума
Начинающий
 
Регистрация: 20.10.2009
Адрес: Там где холодно и сыро.... брр
Сообщения: 135
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

Я использую ADOTable а не ADOQuery
Попытлся с помощью ADOTable

Код:
procedure TForm3.ToolButton19Click(Sender: TObject);
var s,d,f,g,h,j: string;
a:integer;
begin
s:= datamodule4.ADOTable1.Fields.Fields[1].AsString;
d:= datamodule4.ADOTable1.Fields.Fields[2].AsString;
f:= datamodule4.ADOTable1.Fields.Fields[3].AsString;
g:= datamodule4.ADOTable1.Fields.Fields[4].AsString;
h:= datamodule4.ADOTable1.Fields.Fields[5].AsString;
j:= datamodule4.ADOTable1.Fields.Fields[6].AsString;
datamodule4.ADOTable1.Last;
a:= (datamodule4.ADOTable1.Fields.Fields[0].AsInteger + 1);
datamodule4.ADOTable1.Active:=false;
datamodule4.ADOTable2.Active:=true;
datamodule4.ADOTable2.Insert;
datamodule4.ADOTable2.Fields.Fields[0].AsInteger:=a;
datamodule4.ADOTable2.Fields.Fields[1].AsString:=s;
datamodule4.ADOTable2.Fields.Fields[2].AsString:=d;
datamodule4.ADOTable2.Fields.Fields[3].AsString:=f;
datamodule4.ADOTable2.Fields.Fields[4].AsString:=g;
datamodule4.ADOTable2.Fields.Fields[5].AsString:=h;
datamodule4.ADOTable2.Fields.Fields[6].AsString:=j;
datamodule4.ADOTable2.Post;
datamodule4.ADOTable2.Active:=false;
datamodule4.ADOTable1.Active:=true;
datamodule4.ADOtable1.Active:=false;
datamodule4.ADOtable1.Active:=true;
Но у меня не получается с переменной "а" т.к при копировании копируются все поля а значение поля равное переменной "а" ключевое и поэтому приходиться добавлять +1 запись, но почему-то прога дает скопировать раз 5-7 потом выдает ошибку нужно её перезагружать... В чем косяк может быть?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:30.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter