Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

Правильно положить большой файл в БД   Найти похожие ветки 

 
Дмитрий_А   (2006-04-04 10:42) [0]

Здравствуйте, есть база данных на 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 Гб)?
Приму любые советы на этот счет.


 
Ega23 ©   (2006-04-04 10:44) [1]


> хотя бы до 2 Гб?


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


 
Курдль ©   (2006-04-04 10:46) [2]

А причем здесь хранимая процедура?
Может следует поле сделать не типа Image, а типа BLOB?


 
Ega23 ©   (2006-04-04 11:02) [3]


> Может следует поле сделать не типа Image, а типа BLOB?
>


А Image в MS SQL что по-твоему?


 
sniknik ©   (2006-04-04 11:02) [4]

> каким образом правильно закладываеть такие файлы в БД(хотя бы до 2 Гб)?
правильно, имхо, не закладывать таких файлов...

хотя... раз возмость есть, в BOL прописана, то должно "заклыдываться" (хотя бы до 2х гиг ;о)). а у тебя гдето глюк в реализации.

> Может следует поле сделать не типа Image, а типа BLOB?
в MSSQL Image это и есть BLOB. (одно название типа, другое его суть ;)


 
Ega23 ©   (2006-04-04 11:04) [5]

Но в любом случае - 2 Гб - это предел.


 
Nikolay M. ©   (2006-04-04 11:31) [6]

БОЛ - bcp utility, copying data from data file to SQL Server.

Абзац "Importing Image Data".


 
Anatoly Podgoretsky ©   (2006-04-04 12:09) [7]

Дмитрий_А   (04.04.06 10:42)  
У тебя сначала все закачивается на клиента.


 
Дмитрий_А   (2006-04-04 12:38) [8]

Спасибо всем откликнувшися!

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]
У тебя сначала все закачивается на клиента.

Понимаю :), но не знаю, как сразу переслать это на сервер, миную оперативную память клиента. Чего и хочу узнать.


 
Ega23 ©   (2006-04-04 12:48) [9]


>
> Глюк в реализации несомненно. Причем в реализации VCL-оболочки
> для ADO.


Я бы не стал вот так вот категорично...


 
sniknik ©   (2006-04-04 13:07) [10]

>> Глюк в реализации несомненно. Причем в реализации VCL-оболочки
>> для ADO.

> Я бы не стал вот так вот категорично...

я бы даже больше, также категорично заявил обратное... ;о)

тем более автор топика не "гуру" в ADO, показатель "проффесианализма" приведен тут же:  
> Вот код, с помощью которого все это делается:
> ADOQuery1.Close;
> ...
;)


 
Дмитрий_А   (2006-04-04 13:15) [11]

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 нужно винить.


 
Nikolay M. ©   (2006-04-04 13:18) [12]


> путь к этому файлу должен быть виден в SQL-сервера. А если
> клиент и сервер на разных машинах?


1) Создать на клиенте шару, видимую серверу.
2) С помощью xp_cmdshell создавать на сервере шару и класть туда файл.
3) Прочее.


> показатель "проффесианализма"


Гыгы :))) Надеюсь, это была очепятка :)))


 
Nikolay M. ©   (2006-04-04 13:19) [13]


> Шутка ли? Сначала все в опер. память и только потом куда-
> то еще.


Хм. А какие еще могут быть варианты?


 
Дмитрий_А   (2006-04-04 13:30) [14]

Nikolay M. ©   (04.04.06 13:19) [13]
Хм. А какие еще могут быть варианты?

Ну не знаю... небольшими порциями, например.


 
sniknik ©   (2006-04-04 13:43) [15]

небольшими порциями, это другими методами... параметр это переменная, у тебя переменные в программе определяются с возможностью частичной, порционной загрузки/использования?

можно открыть таблицу в режиме cmdTableDirect с серверным курсором, и ложить в поле, тогда в принципе будет создан "канал"/поток и закачивать через стрим частями. (теоретически... проверить надо)

> Гыгы :))) Надеюсь, это была очепятка :)))
не, я сам посебе безграмотный в руск язик. ;) ничего не поделаеш. ;( учится грамотности неинтересно, а врожденной не приобрел.


 
Nikolay M. ©   (2006-04-04 14:02) [16]


> Дмитрий_А   (04.04.06 13:30) [14]
> Ну не знаю... небольшими порциями, например.


И что дальше? На сервер - тоже "небольшими порциями"?


> не, я сам посебе безграмотный в руск язик. ;)


Уже заметил, постараюсь быть снисходительным :)))


 
аматор ©   (2006-04-04 22:32) [17]

Привет...
если ADO не нравится, смените на другой. А чё такие большие файлы бросать в базу, может, если оно не лезет, придумать чёт другое (странно, легче в базе хранить путь к файлику, нежели его туда запихивать (эт просто болтовня, возможно в этом есть необходимость ?)).



Страницы: 1 вся ветка

Текущий архив: 2006.05.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.046 c
15-1146474161
Хинт
2006-05-01 13:02
2006.05.28
Битовый массив


15-1146548663
Ega23
2006-05-02 09:44
2006.05.28
С Днём рождения! 2 мая


8-1135601307
plotn
2005-12-26 15:48
2006.05.28
По lame и mp3 не поможете?


2-1147203470
Mr tray
2006-05-09 23:37
2006.05.28
узнать хендл объекта с фокусом клавиатуры


1-1145265006
dracula
2006-04-17 13:10
2006.05.28
Есть две программы, надо из одной в другую передать строку?