Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
Дмитрий_А   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.011 c
15-1145770404
GrayFace
2006-04-23 09:33
2006.05.28
Скопировать систему с одного диска на другой?


6-1138425550
Spose
2006-01-28 08:19
2006.05.28
Скачать файл с интернета


3-1144132053
RomanH
2006-04-04 10:27
2006.05.28
Автоинкремент в MSSQL


15-1146326262
Adil
2006-04-29 19:57
2006.05.28
Драйвера для ВебКвмеры


15-1146148130
oldman
2006-04-27 18:28
2006.05.28
Навеяно вопросом "А сколько тебе платят?"...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский