Форум: "Базы";
Текущий архив: 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.pasprocedure 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.012 c