Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Вниз

Копирую из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.6 MB
Время: 0.054 c
2-1182842047
peter
2007-06-26 11:14
2007.07.22
Fast Report


15-1182836920
Руслан56
2007-06-26 09:48
2007.07.22
востановление *.DBF /////// HELP


15-1182169577
русланннннннн
2007-06-18 16:26
2007.07.22
Ошибка Ado


2-1182967542
MASReady
2007-06-27 22:05
2007.07.22
Механизм работы post в BDE и в ADO, помогите разобраться


3-1176979672
Сергей М.
2007-04-19 14:47
2007.07.22
VFPOLEDB 9.0 SP1 и REINDEX command





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский