Имя: Пароль:
1C
 
MSSQL DELPHI OLE Бинарные данные, изображение
0 NOFIRG
 
10.07.08
14:05
в DELPHI через OLE получаю ТаблицуЗначений в которой имеется поле с Изображением представленное как ДвоичныеДанные.
Как этот двоичный объект(переменная, поле, незнаю как назвать) можно включить в SQL запрос через ADO чтобы заинсертить в поле типа IMAGE

пробывал преобразовывать в поток, который потом передавать как параметр запросу, неполучилось....

Плиз ХЕЛП!
1 H A D G E H O G s
 
10.07.08
14:15
var
Base64String:String;
.......
.......\

Base64String:=BaseOle.Base64Строка(СтрокаТЗ.Изображение);
Это мы получим ДвоичныеДанные в виде Base64 строки, доступной в Дельфи.
Теперь ищем Base64Encode - алгоритм на Дельфи (желательно без строкового цикличного ресайзинга) и пишем сырые данные в TBlobStream. Ну а дальше - ADO.
Base64Encode могу скинуть вечером...
2 H A D G E H O G s
 
10.07.08
14:16
(0)+ Еще можно попробовать ComSafeArray, но он в восьмерке кривовато реализован, не пробовал...
3 NOFIRG
 
10.07.08
14:23
Спасибо попробую.
алгоритм нашел, если кому пригодиться то вот

function EncodeBase64(Value: String): String;
const
b64alphabet: PChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
 pad: PChar = '====';

 function EncodeChunk(const Chunk: String): String;
 var
   W: LongWord;
   i, n: Byte;
 begin
   n := Length(Chunk); W := 0;
   for i := 0 to n - 1 do
     W := W + Ord(Chunk[i + 1]) shl ((2 - i) * 8);
   Result := b64alphabet[(W shr 18) and $3f] +
             b64alphabet[(W shr 12) and $3f] +
             b64alphabet[(W shr 06) and $3f] +
             b64alphabet[(W shr 00) and $3f];
   if n <> 3 then
     Result := Copy(Result, 0, n + 1) + Copy(pad, 0, 3 - n);   //add padding when out len isn't 24 bits
 end;

begin
 Result := '';
 while Length(Value) > 0 do
 begin
   Result := Result + EncodeChunk(Copy(Value, 0, 3));
   Delete(Value, 1, 3);
 end;
end;


function DecodeBase64(Value: String): String;
const b64alphabet: PChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
 function DecodeChunk(const Chunk: String): String;
 var
   W: LongWord;
   i: Byte;
 begin
   W := 0; Result := '';
   for i := 1 to 4 do
     if Pos(Chunk[i], b64alphabet) <> 0 then
       W := W + Word((Pos(Chunk[i], b64alphabet) - 1)) shl ((4 - i) * 6);
   for i := 1 to 3 do
     Result := Result + Chr(W shr ((3 - i) * 8) and $ff);
 end;
begin
 Result := '';
 if Length(Value) mod 4 <> 0 then Exit;
 while Length(Value) > 0 do
 begin
   Result := Result + DecodeChunk(Copy(Value, 0, 4));
   Delete(Value, 1, 4);
 end;
end;
4 NOFIRG
 
10.07.08
14:26
только думаю не Base64String надо не String а что нить типо WideString
5 H A D G E H O G s
 
10.07.08
14:28
(4) Нет. String
(3) Хероватый алгоритм
6 H A D G E H O G s
 
10.07.08
14:30
Хероватость в
Result := Result + Chr
Надо типа так
Buffer:Pointer;
GetMem(Buffer,Length(Value));
PTR(Cardinal(Buffer)+i)^:=Chr(....
7 H A D G E H O G s
 
10.07.08
14:34
И еще оптимизируем, ибо вдруг у вас нехилые картинки будут
GetMem(Buffer,Round(Length(Value)*0.75)+1);
8 NOFIRG
 
10.07.08
14:49
пасиб, но если не сложно всеже скинь весь алгоритм на grifonspb@mail.ru
не к спеху..
9 H A D G E H O G s
 
10.07.08
14:51
ок
10 MMF
 
10.07.08
15:04
11 H A D G E H O G s
 
10.07.08
16:20
(10) Вопрос спросить хочу
12 NOFIRG
 
11.07.08
12:49
Все равно не получается....


в таблиц значений которую получаю в делфи Фото это
base64Строка(ФотоВДвоичном);

Delphi
.....
Picture:AnsiString;
Stream:TMemoryStream;
.....
Picture:=TZ.Получить(i).Фото;


     SQL:='Declare @a integer '+
     'set @a=(select max(ID)+1 from pList)'+
     'insert into pList(ID,Name,FirstName,MidName,Status,WorkPhone,Picture,BirthDate,Company,Post,TabNumber)'+
     'values (@a,'''+name+''','''+FirstName+''','''+MidName+''',5,'''+WorkPhone+''',:Param,'''+BirdhDate+''',1,'+Post+','''+TabNumber+''') select @a';
     ADOQuery2.Close
     ADOQuery2.SQL.Clear;
     ADOQuery2.SQL.Add(SQL);
     Stream:=TMemoryStream.Create;
     Picture:=MimeDecodeString(Picture);
     Stream.Read(Picture,sizeof(Picture));
     ADOQuery2.Parameters.ParamByName('Param').DataType := ftBlob;
     ADOQuery2.Parameters.ParamByName('Param').Direction := pdInput;
     ADOQuery2.Parameters.ParamByName('Param').LoadFromStream(Stream, ftBlob);
     ADOQuery2.Open;
13 NOFIRG
 
11.07.08
12:50
ругается насчет параметра
14 MMF
 
11.07.08
12:54
если Picture:=TZ.Получить(i).Фото - бинарные данные, то
Stream:=TStringStream.Create(MimeEncodeString(Picture));
try
 ADOQuery2.Parameters.ParamByName('Param').DataType := ftBlob;
 ADOQuery2.Parameters.ParamByName('Param').Direction := pdInput;
 ADOQuery2.Parameters.ParamByName('Param').LoadFromStream(Stream, ftBlob);
finally
 Stream.Free;
end;
15 H A D G E H O G s
 
11.07.08
12:55
Добавь TMemo на форму и выведи туда текст Picture до декодирования
16 MMF
 
11.07.08
12:55
(13) ну дык, йо.
ADOQuery2.Parameters.ParseSQL(ADOQuery2.SQL.Text, True);
17 NOFIRG
 
11.07.08
13:33
(15) Пробывал, там был текст закодированный base64, вроди все норм
(16) Ща папробую...
Независимо от того, куда вы едете — это в гору и против ветра!