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

Вниз

Копирую из InterBase в MS SQL с фотографиями!   Найти похожие ветки 

 
DmitrichJ   (2007-03-30 16:19) [0]

Я перевржу БД из InterBase в MS SQL. Все данные копируются хорошо, но с фотографиями небольшая проблема. Они попадают в MS SQL в обрезаном виде-только начало фотографии, а всё остальное серое. Делаю так:

var
 stream:TStringStream;
...
//выборка из InterBase
 Form1.IBQuery1.SQL.Text:="Select * from ...";
...
//Вставляем в MS SQL
   Form1.Query1.SQL.Text:=
        "Insert into Table(...,photo) values (.... , :P)";

stream:=TStringStream.Create(Form1.IBQuery1.FieldByName("PHOTO").AsString);
Form1.Query1.ParamByName("P").LoadFromStream(stream,ftBlob);
Form1.Query1.ExecSQL;

Подскажите, что не так/

Поля в БД
InterBase: BLOB BLOB sub_type 1 segment size 1 CHARACTER SET WIN1251
MS SQL: IMAGE


 
stud ©   (2007-03-30 16:33) [1]

DmitrichJ   (30.03.07 16:19)
AsString

а он не подрезает их??


 
DmitrichJ   (2007-03-30 16:34) [2]

stud, вообще не должен. Т.к. неограничен, но я пытаюсь сейчас проверить.


 
Jan   (2007-03-30 16:36) [3]


> stream:=TStringStream.Create(Form1.IBQuery1.FieldByName("PHOTO").
> AsString);
> Form1.Query1.ParamByName("P").LoadFromStream(stream,ftBlob);
>

а чего так?  юзай метод Assign.


> Я перевржу БД из InterBase в MS SQL.

почему не через линкед?


 
DmitrichJ   (2007-03-30 16:36) [4]

Проверил. Нет это не он подрезает.


 
DmitrichJ   (2007-03-30 16:36) [5]

Jan, можно пожробнее?


 
Jan   (2007-03-30 16:37) [6]


> Jan, можно пожробнее?

что конкретнее?


 
DmitrichJ   (2007-03-30 16:40) [7]

Jan, что за линкед?


 
Johnmen ©   (2007-03-30 16:42) [8]

....
stream:=TMemoryStream.Create;
TIBBlobField(Form1.IBQuery1.FieldByName("PHOTO")).SaveToStream(stream);
....


 
DmitrichJ   (2007-03-30 16:47) [9]

TIBBlobField из какой библиотки?


 
Johnmen ©   (2007-03-30 16:50) [10]

TBlobField


 
DmitrichJ   (2007-03-30 16:51) [11]

говорит, что нет такой=(


 
DmitrichJ   (2007-03-30 16:57) [12]

Ладно... не важно как, но в MemoryStream я получил полноценную картинку, копирую её на диск-всё нормально.

Может не так я её добавляю в MS SQL?


 
Jan   (2007-03-30 17:17) [13]


> Jan, что за линкед?

линкед сервер из MS SQL на InterBase. Ставишь ODBC драйвер - http://www.praktik.km.ua/downloads/Firebird_ODBC_2.0.0-Win32.exe, добавляешь в ODBC системный DSN - выбираешь установленный драйвер и настраиваешь на нужную тебе базу. В MS SQL добавляешь линкед сервер или через EM или sp_addlinkedserver. И данные перебрасываешь через openquery.


 
DmitrichJ   (2007-03-30 17:24) [14]

Я понял почуму обрезаются картинки.
Почему поле IMAGE в MS SQL вмещает только 2 Мб?


 
DmitrichJ   (2007-03-30 17:25) [15]

ой. Наврал. 32 Кб. При таком способе вставки.


 
DmitrichJ   (2007-03-30 17:35) [16]

Можно ли вставить картинку stream типа TMemoryStream в MS SQL? Или может проблема в самой базе и объявлении типов? Использую тип IMAGE


 
stud ©   (2007-03-30 17:56) [17]

так блоб используй


 
Плохиш ©   (2007-03-30 17:58) [18]


> stream:=TStringStream.Create(Form1.IBQuery1.FieldByName("PHOTO").AsString);

Концом строки является символ #0, вот от этого и думай.

PS. В справке подробненько описано как работают с BLOB-полями, там, по-секрету, даже пример есть...


 
DmitrichJ   (2007-03-30 18:01) [19]

Я нашёл проблему. Дело в том, что Query не может передавать больше 32Кб в одном запросе. Есть другие варианты вставки записей в БД?


 
Плохиш ©   (2007-03-30 18:17) [20]

Используй ADO


 
Jan   (2007-03-30 18:18) [21]


> Используй ADO

там тоже не все так гладко...


 
Виталий Панасенко ©   (2007-03-30 18:24) [22]


> DmitrichJ   (30.03.07 18:01) [19]
> Я нашёл проблему. Дело в том, что Query не может передавать
> больше 32Кб в одном запросе. Есть другие варианты вставки
> записей в БД?

Это ты через БДЕ тянешь ?


 
DmitrichJ   (2007-03-30 19:43) [23]

Виталий Панасенко, да. Использую Query из BDE


 
Desdechado ©   (2007-03-30 19:45) [24]

>  Query не может передавать больше 32Кб в одном запросе.
Враки. Через параметры можно что угодно и сколько угодно.


 
DmitrichJ   (2007-03-30 19:47) [25]

Desdechado, Как именно? Как записать картинку в поле типа IMAGE?


 
Jan   (2007-03-30 19:58) [26]


> Враки. Через параметры можно что угодно и сколько угодно.

нет, там все не так просто... а именно с блобом...


 
DmitrichJ   (2007-03-30 20:15) [27]

При работе с InterBase таким способом закачивается в БД через IBQuery что угодно, а тут вот фигня какая-то=(


 
Jan1   (2007-04-02 11:32) [28]


> При работе с InterBase таким способом закачивается в БД
> через IBQuery что угодно, а тут вот фигня какая-то=(

ключевое слово InterBase. Потому как в M SQL если мы льем чего-нить через параметры, этот гад юзает sp_executesql, а это в свою очередь накладывает отпечаток на то что, сервер пытается выделить память под всю блобину... и тут начинается самое интересное...
ЗЫ чего-то мой логин украли :)


 
DmitrichJ   (2007-04-03 15:48) [29]

Помогите всё же решить проблему. Пожалуйста.


 
Правильный Вася   (2007-04-03 16:09) [30]


> Использую Query из BDE

БДЕ администратор - configuration - drivers - native - mssql - blob size + F1


 
DmitrichJ   (2007-04-03 16:22) [31]

Правильный Вася, извини. Не совсем понял.


 
Правильный Вася   (2007-04-03 16:28) [32]

открываешь, находишь, читаешь описание, делаешь выводы


 
Jan1   (2007-04-03 17:18) [33]


> Помогите всё же решить проблему. Пожалуйста.

млин а линкед то чего не подошел? залил бы за 5 сек и забыл бы о проблеме...


 
DmitrichJ   (2007-04-03 17:35) [34]

Jan1, хорошо. А как потом пользователям добавлть фотографии?


 
Jan1   (2007-04-03 18:05) [35]


> Jan1, хорошо. А как потом пользователям добавлть фотографии?

не понял. причем тут пользователи? тебе надо перенести данные из ФБ в МС? или чего?


 
DmitrichJ   (2007-04-04 13:06) [36]

Jan1, да, но проблема больше в принципе в добавлении фотографии в БД MS SQL. Т.е. вопрос звучит так: Как добавить большую картинку в MS SQL в поле IMAGE?


 
Jan1   (2007-04-04 13:46) [37]


...
ADOCommand.CommandText := " insert into [ImageStore] ([ImageBody]) values(:ImageBody)";
ADOCommand.Parameters.ParameterByName("ImageBody").LoadFromFile(OpenDialog1.File Name, ftVarBytes);
ADOCommand.Execute();
...

Но учти что с большИми могут быть траблы... все зависит от сервера где крутится MS SQL...


 
DmitrichJ   (2007-04-04 13:50) [38]

Jan1, вот по этой схеме через BDE Query он и закружает только часть картинки, а при использовании ADO выдаёт ошибку=(


 
DmitrichJ   (2007-04-04 13:56) [39]

Jan1, использую BDE Query по такому же принципу. Картинки загружает, но не полностью. А при использовании ADO даёт ошибку.


 
Jan1   (2007-04-04 13:58) [40]


> А при использовании ADO даёт ошибку.

и где она?


 
DmitrichJ   (2007-04-04 14:51) [41]

Делаю запрос:

Form1.ADOQuery1.SQL.Text:="insert into table1 (np,name,d1,d2) values(0,"текст",:P1,:P2)";

Ошибка:
The name "текст" is not permitted in this context. Only constants, expression, or variables allowed here. Column names are not permitted.

name varchar(200)


 
Jan1   (2007-04-04 15:09) [42]


> Form1.ADOQuery1.SQL.Text:="insert into table1 (np,name,d1,
> d2) values(0,"текст",:P1,:P2)";

вместо двойных кавычек надо использовать две одинарные. И если ты уж начал использовать параметры, то чего тут всдумал вдруг подругому?
ADOQuery1 - пережиток. юзай ADOCommand.


 
DmitrichJ   (2007-04-04 15:20) [43]

Странно почему одинарные, и всё же добавляет, но такая же фигня с обрезанием картинок. Уже не знаю что делать=(


 
Jan1   (2007-04-04 15:25) [44]


> Странно почему одинарные

ничего странного.


> и всё же добавляет, но такая же фигня с обрезанием картинок.
>  Уже не знаю что делать=(

не понял. что с обрезанием? теперь ошибки нет?


 
DmitrichJ   (2007-04-04 21:32) [45]

Jan1, ошибки при добавлении нет. И в BDE не было. Просто саму картинку он добавляет только 32кб, а всё остальное нет.


 
Jan1   (2007-04-05 10:34) [46]


> Jan1, ошибки при добавлении нет. И в BDE не было. Просто
> саму картинку он добавляет только 32кб, а всё остальное
> нет.

1. Версия сервера, сервис паки и т.п.
2. Какие драйвера юзаешь.
3. Полностью код.
4. Как проверяешь.


 
DmitrichJ   (2007-04-05 12:21) [47]

Настройки DBE:
 DataBase:
   DataBaseName=aventin
   DriverName=MSSQL
   Params:
     User Name=sa
     Pssword=...
     ServerName=server1
     DataBase Name=aventin
 Query:
   DataBaseName=aventin
   {в параметрах ничего не указываю, другие настройки по умолчанию}

Делаю собственно добавление, как писал выше:
var
stream:TMemoryStream;
...

//Вставляем в MS SQL

  Form1.Query1.SQL.Text:=
       "Insert into Table(...,photo) values (.... , :P)";
 stream:=TMemoryStream.Create;
 stream.LoadFromFile("...");
 Form1.Query1.ParamByName("P").LoadFromStream(stream,ftBlob);
 Form1.Query1.ExecSQL;
 
Form1.Query1.ExecSQL;

//--------------MS SQL
 photo IMAGE

Проверка:
  Form1.Query1.SQL.Text:=
       "Select * from table where...";
  Form1.Query1.Active;

1. Проверяю в отчёте Fast Reporte 4, картинка связывается с полем и отображается только часть, хотя тоже самое в InterBase делается всё полностью.
2.
var
 stream:TStringStream;
...
 stream:=TStringStream.Create(Form1.Query1.FieldByName("photo").asstring);
 ShowMessage(inttostr(stream.size)+"b");

 Результат: 32768b. Если данные меньше, то всё ок, а если больше то отсекаются.


 
Jan1   (2007-04-05 12:26) [48]


> 1. Версия сервера, сервис паки и т.п.
> 2. Какие драйвера юзаешь.

где?


 
DmitrichJ   (2007-04-05 12:32) [49]

1. На сервере Microsoft SQL Server 2000 (server и client)
   На клиенте Microsoft SQL Server 2000 (client)

2. Извини, про драйвера не совсем понял. Если в DataBase, то MSSQL


 
Jan1   (2007-04-05 12:41) [50]


> 1. На сервере Microsoft SQL Server 2000 (server и client)
>    На клиенте Microsoft SQL Server 2000 (client)

что дает select @@version?


 
DmitrichJ   (2007-04-05 12:49) [51]

Microsoft SQL Server  2000 - 8.00.760 (Intel X86)   Dec 17 2002 14:22:05   Copyright (c) 1988-2003 Microsoft Corporation  Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)


 
Jan1   (2007-04-05 13:06) [52]


> Microsoft SQL Server  2000 - 8.00.760

не мешало бы обновиться... уже 4-й сервис пак вышел.
SP4 + Hot Fixes


 
Jan1   (2007-04-05 13:07) [53]


>   Form1.Query1.SQL.Text:=
>        "Insert into Table(...,photo) values (.... , :P)";
>
>  stream:=TMemoryStream.Create;
>  stream.LoadFromFile("...");
>  Form1.Query1.ParamByName("P").LoadFromStream(stream,ftBlob);
>
>  Form1.Query1.ExecSQL;

запусти профайлер и посмотри какой запрос идет на сервак.


 
DmitrichJ   (2007-04-05 13:20) [54]

Insert into Table(...,photo) values (.... , 0xffd8....
там где данные картинки строка короткая для картинки и не закрывается скобкой


 
DmitrichJ   (2007-04-05 13:20) [55]

не знаю как из проф файла сразу всё скопировать.


 
DmitrichJ   (2007-04-05 14:16) [56]

Не всё так просто! Там есть команда: set textsize 32786 !!!!!!!!!!!! Как её изменить?


 
DmitrichJ   (2007-04-05 15:03) [57]

Если послать команду set text size < чем 32768, то все данные и будут так работать, но если поставить> 32768, то всё равно 32768. ЧЁРТ!!!!


 
DmitrichJ   (2007-04-05 15:03) [58]

Если послать команду set text size < чем 32768, то все данные и будут так работать, но если поставить> 32768, то всё равно 32768. ЧЁРТ!!!!


 
Gadenysh   (2007-04-05 18:36) [59]

так я заливаю медиа через АДО. может, чем поможет

procedure TDataContext.PutBLOBData(ImageID, ContentTypeID, MediaTypeID: integer;
 MediaURL: string; Stream: TStream);
var
 q: TADODataSet;
 sm: TStream;
begin
 q := TADODataSet.Create(nil);
 try
   q.Connection := Datasource;
   DBUtils.RunQuery(q, sqlAppendMedia,  ["id", "contentTypeID", "mediaTypeID", "mediaURL"],
     [ImageID, ContentTypeID, MediaTypeID, MediaURL], true); // тут обычный инсерт для всех полей кроме Image
   q.Edit;
   sm := q.CreateBlobStream(q.FieldByName("MediaFile"), bmWrite);
   try
     Stream.Position := 0;
     sm.CopyFrom(Stream, Stream.Size);
   finally
     sm.Free;
   end;
   q.Post;
 finally
   q.Free;
 end;
end;


 
DmitrichJ   (2007-04-06 12:30) [60]

Что такое DBUtils?


 
DmitrichJ   (2007-04-06 15:35) [61]

что такое DBUtils?


 
Gadenysh   (2007-04-06 17:54) [62]


> что такое DBUtils?

да неважно - это моя библиотека. RunQuery - обертка, выполняющая запросы.Для тебя же общий принцип такой - вставляется запись без поля Image. Потом позиционируешь на нее датасет(по ID например), делаешь Edit, создаешь поток для поля и копируешь в него из созданного ранее потока с картинкой. Делаешь Post. вобщем, см. код


 
Германн ©   (2007-04-07 01:51) [63]

Чой-то как не заглянешь в "Базы", сей топик где-то сверху уже вторую неделю. :(

Я вот только не пойму - зачем "фото" хранить в самой базе? Это что - редактируемая пользователями на уровне пикселей информация?


 
DmitrichJ   (2007-04-19 12:21) [64]

Если кому интересно, то проблема была в компоненте подключения, что BDE, что ADO одно и то же. Не реагируют на TextSize. После подключение через библиотеки dbExpress всё решилось само сабой и заработало как часы. Всем мпасибо!



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

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

Наверх




Память: 0.62 MB
Время: 0.029 c
15-1182329521
Суслик
2007-06-20 12:52
2007.07.22
Коллекции рисунков на tool button ы


15-1182442216
oxffff
2007-06-21 20:10
2007.07.22
Codegear Roadmap


2-1182846767
zvm
2007-06-26 12:32
2007.07.22
Неожиданное-рядом!! (или как прервать программу?)


2-1183037115
Nikfel
2007-06-28 17:25
2007.07.22
Как вывести текст по центру на canvas.


2-1182915878
Lebedev
2007-06-27 07:44
2007.07.22
Как циклом перебрать все компоненты одного рода?