Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Правильно положить большой файл в БД [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 Гб?


Нормальный такой файл...


Наверх

Титульная страница Поиск, карта сайта Написать письмо