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

Вниз

VARCHAR(15000) ???   Найти похожие ветки 

 
GanibalLector ©   (2004-10-08 00:44) [0]

Насколько это опасно???
З.Ы. Это не поле в таблице,это выходой параметр в ХП.

З.З.Ы. Просто меня уморило делать UDF для преобразования в BLOB.


 
kaif ©   (2004-10-08 01:43) [1]

Да вроде спокойно можно такие вещи делать. Подумаешь! В конце-концов это всего 15К. Прикинь, что это jpeg-файл. Стал бы ты спрашивать про то, может ли быть такой большой jpeg? Какой же он большой? Совсем даже небольшой. Я не удивлюсь, если и 30K спокойно заработает. Это же не поле таблицы, на которое хочется индекс повесить?
 Возьмем какую-нибудь UDF. Например:

DECLARE EXTERNAL FUNCTION RTRIM CSTRING(32767)
RETURNS CSTRING(32767) FREE_IT
ENTRY_POINT "IB_UDF_rtrim" MODULE_NAME "ib_udf";

 Как видим, народ не скупится на длину параметра. А нафик такой длинный параметр? Откуда-то ведь предполагается в него данные-то передавать... Значит правда написана, что VARCHAR может иметь такие длины. Я бы просто на тормоз попробовал - и все дела. Единственная опасность - тормоз получить. Если тормоза не заметил бы - вообще даже думать бы не стал про какие-то там "опасности". Не мегабайт и не гигабайт. Вшивых 15K. Так что, ИМХО, нормально. Однако вот как-то нужно все же гарантировать, чтобы за длину не выскочить. Иначе неприятности будут.
Я обычно ограничиваю длины (если они могут выскочить, например, после конкатенации в ХП). Использую strlen, чтобы длину измерить и substr, чтобы обрезать, если выскочила:

DECLARE EXTERNAL FUNCTION substr
CSTRING(32767), SMALLINT, SMALLINT
RETURNS CSTRING(32767) FREE_IT
ENTRY_POINT "IB_UDF_substr" MODULE_NAME "ib_udf";

DECLARE EXTERNAL FUNCTION strlen
CSTRING(32767)
RETURNS INTEGER BY VALUE
ENTRY_POINT "IB_UDF_strlen" MODULE_NAME "ib_udf";

Правда я редко работаю с длинами больше 1K.


 
GanibalLector ©   (2004-10-08 01:51) [2]

2 kaif
Кстати,по поводу UDF.Откуда они были взяты???
З.Ы. Естественно интересует *.drp от ib_udf.dll


 
Digitman ©   (2004-10-08 09:04) [3]


> Просто меня уморило делать UDF для преобразования в BLOB


значит, ты чего-то недопонимаешь ..
никаких сложностей в этом нет

function InternalGetBlobSegment(Blob: PBlob; Buffer: Pointer; BufSize: ULong): ULong;
var
TotalBytesRead: Integer;
begin
  TotalBytesRead := 0;
  if Assigned(Blob) then with Blob^ do
    if Assigned(BlobHandle) and Assigned(GetSegment)
    and Boolean(GetSegment(BlobHandle, Buffer, Min(BufSize, MaxSegmentLength), TotalBytesRead)) then
      Result:= TotalBytesRead
    else
      Result:= 0;
end;

function InternalGetBlob(Blob: PBlob; Buffer: Pointer; Size: Integer): ULong;
var
  BytesRead: Integer;
begin
  Result:= 0;
  if Assigned(Blob) then with Blob^ do
    if Assigned(BlobHandle) and Assigned(GetSegment) then
       while (Size > 0) do
       begin
         BytesRead := InternalGetBlobSegment(Blob, PChar(Buffer) + Result, Size);
         if BytesRead = 0 then
           Break;
         Inc(Result, BytesRead);
         Dec(Size, BytesRead);
       end;
end;

function InternalPutBlob(Blob: PBlob; Buffer: Pointer; Size: Integer): ULong;
var
 BytesToWrite: Integer;
begin
  Result:= 0;
  if Assigned(Blob) then with Blob^ do
    if Assigned(BlobHandle) and Assigned(PutSegment) then while (Size > 0) do begin
      BytesToWrite:= Min(DefaultBlobSegmentSize, Size);
      PutSegment(BlobHandle, PChar(Buffer) + Result, BytesToWrite);
      Dec(Size, BytesToWrite);
      Inc(Result, BytesToWrite);
    end;
end;

function StringToBlob(Value: PChar; Blob: PBlob): PBlob; cdecl;
begin
 Result:= Blob;
 if Assigned(Result) and Assigned(Value) then
   with Result^ do
   try
     if Assigned(BlobHandle) and Assigned(PutSegment) then
       InternalPutBlob(Result, Value, StrLen(Value) + 1)
     else
       Result:= nil;
   except
     Result:= nil;
   end;
end;

function BlobToString(Blob: PBlob): PChar; cdecl; //free_it
var
 bytes_read: Longint;
begin
 Result:= nil;
 if Assigned(Blob) then
   with Blob^ do
   try
     if Assigned(BlobHandle) and (TotalSize > 0) and Assigned(GetSegment) then
       begin
         Result := ib_util_malloc(TotalSize + 1);
         bytes_read := InternalGetBlob(Blob, Result, TotalSize);
         Result[bytes_read] := #0;
       end;
   except
     Result:= nil;
   end;
end;

declare external function StringToBlob
cstring(32767), blob
returns parameter 2

declare external function BlobToString
blob
returns cstring(32767) free_it


 
Johnmen ©   (2004-10-08 09:34) [4]

>сделал выходным параметром varchar(15000) и наступило СЧАСТЬЕ.

Так я и намекал, что это проще. До 32000.


 
GanibalLector ©   (2004-10-08 09:39) [5]

2 Digitman ©   (08.10.04 09:04) [3]
Дело в том,что написал см. http://delphimaster.net/view/3-1097164914/ .Работает так
BL= BlobCat(некоторое поле,еще один BLOB)
когда делаю так:
BL= BlobCat(некоторое поле,BL) то  в BLOBe сохраняется только последнее значения "некоторого поля"

Ну да ладно,ща я подключу Вашу...посмотрю.Спасибо как всегда.

2 Johnmen ©   (08.10.04 09:34) [4]
>Так я и намекал, что это проще. До 32000.
Где это Вы намекали???Вроде постов Ваших не было.


 
Johnmen ©   (2004-10-08 09:45) [6]

>Где это Вы намекали???Вроде постов Ваших не было.

Вот там, на что ты дал ссылку...:)


 
GanibalLector ©   (2004-10-08 09:51) [7]

2 Johnmen ©
Вот там, на что ты дал ссылку...:)
То,похоже не на намек,а на вопрос.Без обид


 
Johnmen ©   (2004-10-08 10:04) [8]

>GanibalLector ©   (08.10.04 09:51) [7]

В любом встречном вопросе есть доля намека. А в этом особенно. Ведь ты же, наверно, задумался, а чёй то он (т.е. я) задаёт такой (не очень в тему) вопрос ?



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

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

Наверх




Память: 0.49 MB
Время: 0.047 c
1-1098353405
digger
2004-10-21 14:10
2004.11.07
Описание объектной модели Object Pascal


14-1098438631
sergei
2004-10-22 13:50
2004.11.07
Учитель по Делфи Ау!!!!


14-1098073504
Aldor
2004-10-18 08:25
2004.11.07
Application failed to initialize properly (адрес).


3-1095409521
Guf
2004-09-17 12:25
2004.11.07
ADO Access *.udl


3-1097232652
SergP.
2004-10-08 14:50
2004.11.07
Строка подключения для FOX(Dbase) через Microsoft.Jet.OLEDB.4.0