![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по хранению файлов в БД
cyborg © (2009-02-13 14:41:00)Хочу сохранить в базе файл. Делаю это следующим образом.
procedure TForm1.Button1Click(Sender: TObject);
var
blob: TStream;
fs:TFileStream;
begin
blob := MSQuery1.CreateBlobStream(MSQuery1.FieldByName('Enclosure'), bmWrite);
try
blob.Seek(0, soFromBeginning);
fs := TFileStream.Create('d:\1.txt', fmOpenRead or fmShareDenyWrite);
try
MSQuery1.Insert;
blob.CopyFrom(fs, fs.Size);
MSQuery1.Post;
finally
fs.Free
end;
finally
blob.Free
end;
end;
Выдается сообщение: "MSQuery1: Field 'Enclosure' not found."
Что нужно сделать чтобы поле все-таки находилось?
cyborg (2009-02-17 09:53:00) [1]
> clickmaker
Что-то я стормозил. Пытался сначала остальные поля тоже через блобы добавлять :)
clickmaker (2009-02-16 16:49:00) [2]> Как одновременно со вставкой блоба заполнить еще и Int?
ну ё-мое, совсем-то расслабляться уж не надо. Даже если "на форуме часто быстрее можно получить ответ".
добавить еще строчку кода после blob.CopyFrom(fs, fs.Size); не приходило в голову?
cyborg (2009-02-16 16:44:00) [3]
> Плохиш
Да, неплохо было бы. Хотя на форуме часто быстрее можно получить ответ.
Еще вопрос. Допустим есть таблица: первое поле ID, второе Blob, третье Int. IDшник заполняется автоматически при добавлении новой записи. Как одновременно со вставкой блоба заполнить еще и Int?
Плохиш (2009-02-16 10:54:00) [4]
> cyborg (13.02.09 15:45) [10]
Стоит всё-таки прочитать какой букварь по основам выбранного языка программирования...
cyborg (2009-02-13 15:45:00) [5]
> Сергей М.
Круто! Теперь все работает.
Спасибо, добрый человек!
Сергей М. (2009-02-13 15:37:00) [6]
> почему для первой записи этого не требовалось?
>
Видимо потоу что НД у тебя при этом по хз какой-то причине ужебыл в режиме вставки, потому ты и не схлопотал исключение. А по-хорошему должен был схлопотать уже при первой записи, если бы при этом НД находился в статусе dsBrowse
Сергей М. (2009-02-13 15:34:00) [7]
> cyborg
Пример же в справке есть (цитирую):
try
// сначалаНД переводится в режим редактирования или вставки
ClientDataSet1.Edit;
// и только послеперевода в этот режим создается блоб-стрим, привязанный к нужному полю
Stream2 := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName('Remarks'),
bmReadWrite);
try
...
// ну и наконец сохранение изменений и возврат НД в режим обзора
ClientDataSet1.Post;
finally
Stream2.Free;
end;
cyborg (2009-02-13 15:31:00) [8]
> Anatoly Podgoretsky ©
А как его перевести в "edit or insert mode" и почему для первой записи этого не требовалось?
Anatoly Podgoretsky (2009-02-13 15:25:00) [9]> cyborg (13.02.2009 15:14:04) [4]
Теперь надо что бы было в "edit or insert mode"
Anatoly Podgoretsky (2009-02-13 15:25:00) [10]> Petr V. Abramov (13.02.2009 15:06:03) [3]
Ну не Линксоиды же, какой еще регистр.
cyborg (2009-02-13 15:14:00) [11]Добавил запрос: "Select [Enclosure] from dbo.[Enclosure]". Теперь поле находится, и даже добавляется одна запись. Но когда я хочу добвить следующую, выдается ошибка: "Dataset not in edit or insert mode."
Что за хрень? Почему когда добавляю первую запись DataSet находится в нормальном режиме, а потом в него нельзя добавлять?
Petr V. Abramov (2009-02-13 15:06:00) [12]еще можно регистр букв проверить
clickmaker (2009-02-13 14:48:00) [13]> Что нужно сделать чтобы поле все-таки находилось?
нужно, чтобы оно было в наборе данных, который возвращает запрос в MSQuery1
Johnmen (2009-02-13 14:48:00) [14]Надо, чтобы это поле было в наборе данных.
Что для этого сделать - тебе решать.