![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильно положить большой файл в БД [D6, MSSQL]
Дмитрий_А © (2006-04-04 10:42:00)Здравствуйте, есть база данных на MSSQL Server, в нем таблица, в ней поле типа Image.
Есть хранимая процедура, которая принимает на входе двоичные данные и заносит их в вышеупомянутую таблицу.
Вот код, с помощью которого все это делается:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('exec dbo.PutBlob @content=:Content');
ADOQuery1.Parameters.ParamByName('Content').DataType := ftMemo;
ADOQuery1.Parameters.ParamByName('Content').LoadFromFile('d:\temp.rar', ftGraphic);
ADOQuery1.ExecSQL;
Все отлично работает если файл относительно небольшого размера (до 150 МБ).
Но как только идет попытка занести БОЛЬШОЙ(от 200 Мб) файл - все виснет навсегда. Либо после долгого периода - Out Of Memory.
Вопрос: каким образом правильно закладываеть такие файлы в БД(хотя бы до 2 Гб)?
Приму любые советы на этот счет.
аматор (2006-04-04 22:32:00) [1]Привет...
если ADO не нравится, смените на другой. А чё такие большие файлы бросать в базу, может, если оно не лезет, придумать чёт другое (странно, легче в базе хранить путь к файлику, нежели его туда запихивать (эт просто болтовня, возможно в этом есть необходимость ?)).
Nikolay M. (2006-04-04 14:02:00) [2]
> Дмитрий_А (04.04.06 13:30) [14]
> Ну не знаю... небольшими порциями, например.
И что дальше? На сервер - тоже "небольшими порциями"?
> не, я сам посебе безграмотный в руск язик. ;)
Уже заметил, постараюсь быть снисходительным :)))
sniknik (2006-04-04 13:43:00) [3]небольшими порциями, это другими методами... параметр это переменная, у тебя переменные в программе определяются с возможностью частичной, порционной загрузки/использования?
можно открыть таблицу в режиме cmdTableDirect с серверным курсором, и ложить в поле, тогда в принципе будет создан "канал"/поток и закачивать через стрим частями. (теоретически... проверить надо)
> Гыгы :))) Надеюсь, это была очепятка :)))
не, я сам посебе безграмотный в руск язик. ;) ничего не поделаеш. ;( учится грамотности неинтересно, а врожденной не приобрел.
Дмитрий_А (2006-04-04 13:30:00) [4]Nikolay M. © (04.04.06 13:19) [13]
Хм. А какие еще могут быть варианты?
Ну не знаю... небольшими порциями, например.
Nikolay M. (2006-04-04 13:19:00) [5]
> Шутка ли? Сначала все в опер. память и только потом куда-
> то еще.
Хм. А какие еще могут быть варианты?
Nikolay M. (2006-04-04 13:18:00) [6]
> путь к этому файлу должен быть виден в SQL-сервера. А если
> клиент и сервер на разных машинах?
1) Создать на клиенте шару, видимую серверу.
2) С помощью xp_cmdshell создавать на сервере шару и класть туда файл.
3) Прочее.
> показатель "проффесианализма"
Гыгы :))) Надеюсь, это была очепятка :)))
Дмитрий_А (2006-04-04 13:15:00) [7]Ega23 © (04.04.06 12:48) [9]
sniknik © (04.04.06 13:07) [10]
Не гуру :)
Но моего "профессионализма" все же хватило чтобы заглянуть в юнит ADODB.pas
procedure TParameter.LoadFromStream(Stream: TStream; DataType: TDataType);
var
StrData: string;
WStrData: WideString;
BinData: OleVariant;
DataPtr: Pointer;
Len: Integer;
begin
Self.DataType := DataType;
with Stream do
begin
Position := 0;
Len := Size;
case DataType of
ftString, ftFixedChar, ftMemo:
begin
.....
end;
ftWideString:
begin
....
end;
else { Assume binary for all others }
begin
BinData := VarArrayCreate([0, Len-1], varByte); // финиш!!!!!!!
DataPtr := VarArrayLock(BinData);
try
ReadBuffer(DataPtr^, Len);
Self.Value := BinData;
finally
VarArrayUnlock(BinData);
end;
end;
end;
end;
end;
Шутка ли? Сначала все в опер. память и только потом куда-то еще.
Возможно, выразился неправильно насчет VCL-оболочки, тут само ADO нужно винить.
sniknik (2006-04-04 13:07:00) [8]>> Глюк в реализации несомненно. Причем в реализации VCL-оболочки
>> для ADO.
> Я бы не стал вот так вот категорично...
я бы даже больше, также категорично заявил обратное... ;о)
тем более автор топика не "гуру" в ADO, показатель "проффесианализма" приведен тут же:
> Вот код, с помощью которого все это делается:
> ADOQuery1.Close;
> ...
;)
Ega23 (2006-04-04 12:48:00) [9]
>
> Глюк в реализации несомненно. Причем в реализации VCL-оболочки
> для ADO.
Я бы не стал вот так вот категорично...
Дмитрий_А (2006-04-04 12:38:00) [10]Спасибо всем откликнувшися!
2 sniknik © (04.04.06 11:02) [4]
>>хотя... раз возмость есть, в BOL прописана, то должно "заклыдываться" >>(хотя бы до 2х гиг ;о)). а у тебя гдето глюк в реализации
Глюк в реализации несомненно. Причем в реализации VCL-оболочки для ADO. Вот я и хочу увидеть альтернативные пути решения такой проблемы.
2 Nikolay M. © (04.04.06 11:31) [6]
БОЛ - bcp utility, copying data from data file to SQL Server.
В этом методе, как я понял, указывается имя файла, что означает, что путь к этому файлу должен быть виден в SQL-сервера. А если клиент и сервер на разных машинах?
2 Anatoly Podgoretsky © (04.04.06 12:09) [7]
У тебя сначала все закачивается на клиента.
Понимаю :), но не знаю, как сразу переслать это на сервер, миную оперативную память клиента. Чего и хочу узнать.
Anatoly Podgoretsky (2006-04-04 12:09:00) [11]Дмитрий_А (04.04.06 10:42)
У тебя сначала все закачивается на клиента.
Nikolay M. (2006-04-04 11:31:00) [12]БОЛ - bcp utility, copying data from data file to SQL Server.
Абзац "Importing Image Data".
Ega23 (2006-04-04 11:04:00) [13]Но в любом случае - 2 Гб - это предел.
sniknik (2006-04-04 11:02:00) [14]> каким образом правильно закладываеть такие файлы в БД(хотя бы до 2 Гб)?
правильно, имхо, не закладывать таких файлов...
хотя... раз возмость есть, в BOL прописана, то должно "заклыдываться" (хотя бы до 2х гиг ;о)). а у тебя гдето глюк в реализации.
> Может следует поле сделать не типа Image, а типа BLOB?
в MSSQL Image это и есть BLOB. (одно название типа, другое его суть ;)
Ega23 (2006-04-04 11:02:00) [15]
> Может следует поле сделать не типа Image, а типа BLOB?
>
А Image в MS SQL что по-твоему?
Курдль (2006-04-04 10:46:00) [16]А причем здесь хранимая процедура?
Может следует поле сделать не типа Image, а типа BLOB?
Ega23 (2006-04-04 10:44:00) [17]
> хотя бы до 2 Гб?
Нормальный такой файл...