|
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
|
Все равно не получается....
1с в таблиц значений которую получаю в делфи Фото это 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) Ща папробую... |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |