свойство типа byte[] не маппится
От: oleksab Украина  
Дата: 09.02.06 13:15
Оценка:
Здравствуйте

ObjectMapper в _members не добавляет поля объектов типа byte[] (timestamp на базе).
например для
public class Test
{
    public byte[] Stamp;
}

ObjectMapper.GetIgnore(MemberAccessor memberAccessor) возвращает true для memberAccessor свойства Stamp, потому что это класс и не строка:
            Type type = memberAccessor.Type;

            return type.IsClass && type != typeof(string);


В Rsdn Data Framework все работало. Скажите пожалуйста, нужно переопределять GetIgnore в своем наследнике ObjectMapper-a или это будет исправлено?

Спасибо.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re: свойство типа byte[] не маппится
От: IT Россия linq2db.com
Дата: 09.02.06 13:31
Оценка:
Здравствуйте, oleksab, Вы писали:

O> В Rsdn Data Framework все работало. Скажите пожалуйста, нужно переопределять GetIgnore в своем наследнике ObjectMapper-a или это будет исправлено?


Будет исправлено.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: свойство типа byte[] не маппится
От: Аноним  
Дата: 28.02.06 16:48
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, oleksab, Вы писали:


O>> В Rsdn Data Framework все работало. Скажите пожалуйста, нужно переопределять GetIgnore в своем наследнике ObjectMapper-a или это будет исправлено?


IT>Будет исправлено.


Да, не раюотает до сих пор
Re[3]: свойство типа byte[] не маппится
От: IT Россия linq2db.com
Дата: 28.02.06 18:21
Оценка:
Здравствуйте, Аноним, Вы писали:

IT>>Будет исправлено.


А>Да, не раюотает до сих пор


Сегодня выложу изменения.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: свойство типа byte[] не маппится
От: Аноним  
Дата: 01.03.06 11:02
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Аноним, Вы писали:


IT>>>Будет исправлено.


А>>Да, не раюотает до сих пор


IT>Сегодня выложу изменения.


Да, работает. Спасибо. Вы сделали хорошую библиотеку
Re[5]: свойство типа byte[] не маппится
От: IT Россия linq2db.com
Дата: 01.03.06 13:16
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Да, работает. Спасибо.


Пожалуйста!

А> Вы сделали хорошую библиотеку


Рад стараться
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: свойство типа byte[] не маппится
От: Аноним  
Дата: 06.06.06 15:37
Оценка:
Добрый день.
Возвращаясь к типу byte[]. Собственно, мой вопрос касается любого массива, не только byte[]. При попытке объявить его как абстрактное свойство:

public abstract byte[] ContentData { get; set; }

вылетает ошибка в файле DefaultTypeBuilder:

        private void CreateDefaultInstance(
            FieldBuilder field, TypeHelper fieldType, TypeHelper objectType, EmitHelper emit)
        {
            if (!CheckObjectHolderCtor(fieldType, objectType))
                return;

            if (objectType.Type == typeof(string))
            {
                emit
                    .ldarg_0
                    .LoadInitValue (objectType)
                    ;
            }
            else
            {
                ConstructorInfo ci = objectType.GetPublicDefaultConstructor();

                if (ci == null)
                {
                    if (objectType.Type.IsValueType)
                        return;

                    string message = string.Format(
                        "Could not build the '{0}' property of the '{1}' type: type '{2}' has to have public default constructor.",
                        Context.CurrentProperty.Name,
                        Context.Type.FullName,
                        objectType.FullName)

Причина в том, что массив является ссылочным типом, а конструктора по умолчанию не имеет.

Если вместо абстрактного свойства использовать обычное поле:

public byte[] ContentData;

то всё работает, потому что данный элемент тогда вообще не вызывается методом CreateDefaultInstance.

Что делать, подскажите, пожалуйста.
Re[7]: свойство типа byte[] не маппится
От: IT Россия linq2db.com
Дата: 06.06.06 16:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что делать, подскажите, пожалуйста.


Хорошо бы это пофиксить. А пока можно попробовать NoInstanceAttribute.
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: свойство типа byte[] не маппится
От: Блудов Павел Россия  
Дата: 07.06.06 00:57
Оценка:
Здравствуйте, IT, Вы писали:

IT>Хорошо бы это пофиксить. А пока можно попробовать NoInstanceAttribute.

У меня работает Обязательно сделаю в официальном релизе. В списке todo стоит на третьем месте.

Собственно, работы не очень много, но есть одна тонкость:
Oracle и DB2 нормально работают с массивами скалярных объектов. Oracle точно, а с DB2 нужно дождаться релиза вайпера. Или у Игоря спросить, он с Ibm работает.

Отсюда имеем полный набор всяких decimal[], string[] и в качестве дополнения byte[][] массив блобов, char[][] массив строк или клобов.
Много несностей при отправке на сервер, да ещё больше при получении. Вообще, output параметры-массивы это изврат, курсоры для этого подходят лучше.
Вобщем для головы работы больше, чем для рук.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[9]: свойство типа byte[] не маппится
От: oleksab Украина  
Дата: 07.06.06 06:26
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Вообще, output параметры-массивы это изврат, курсоры для этого подходят лучше.


может быть, только вот MS SQL-ный timestamp мапится в byte[4] (если я все правильно помню). И что — курсор заводить для этого?
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[8]: свойство типа byte[] не маппится
От: maldi  
Дата: 07.06.06 07:30
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Аноним, Вы писали:


А>>Что делать, подскажите, пожалуйста.


IT>Хорошо бы это пофиксить. А пока можно попробовать NoInstanceAttribute.


Спасибо, помогло. Ждём новый релиз.
Re[9]: свойство типа byte[] не маппится
От: maldi  
Дата: 07.06.06 11:37
Оценка:
Здравствуйте, maldi, Вы писали:

M>Здравствуйте, IT, Вы писали:


IT>>Здравствуйте, Аноним, Вы писали:


А>>>Что делать, подскажите, пожалуйста.


IT>>Хорошо бы это пофиксить. А пока можно попробовать NoInstanceAttribute.


M>Спасибо, помогло. Ждём новый релиз.


Кстати, когда будете фиксить, не забудьте такой момент. Когда я ставлю атрибут NoInstanceAttribute, на маппинг по умолчанию идёт значение null (если явно не задать это значение). Этот null интерпретируется маппером как nvarchar(max) вместо varbinary(max) (использую MSSql Express) и получаем ошибку уже в БД — "Implicit conversion from data type nvarchar to varbinary(max) is not allowed. Use the CONVERT function to run this query" . Так что создавать элемент по умолчанию нужно всегда, должен быть пустой массив (в моём случае byte[]), а не null.
Или это можно как-то обойти?
Re[10]: свойство типа byte[] не маппится
От: IT Россия linq2db.com
Дата: 07.06.06 14:24
Оценка:
Здравствуйте, maldi, Вы писали:

M>Или это можно как-то обойти?


Зависит от того как создаётся этот параметр.
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: свойство типа byte[] не маппится
От: maldi  
Дата: 08.06.06 14:07
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, maldi, Вы писали:


M>>Или это можно как-то обойти?


IT>Зависит от того как создаётся этот параметр.



TypeAccessor<MY_TYPE>.CreateInstanceEx();

если имеется в виду это. Так создаётся экземпляр всего класса, а данный параметр явно нигде не создаётся, только объявляется как я писал раньше. И после этого пытаюсь записать объект в БД, заполнив предварительно некоторые поля, за исключением этого.
Re[12]: свойство типа byte[] не маппится
От: IT Россия linq2db.com
Дата: 08.06.06 16:01
Оценка:
Здравствуйте, maldi, Вы писали:

M>если имеется в виду это. Так создаётся экземпляр всего класса, а данный параметр явно нигде не создаётся, только объявляется как я писал раньше. И после этого пытаюсь записать объект в БД, заполнив предварительно некоторые поля, за исключением этого.


Я пофиксил инициализацию массивов, теперь должно работать.
Если нам не помогут, то мы тоже никого не пощадим.
Re[13]: свойство типа byte[] не маппится
От: maldi  
Дата: 09.06.06 07:57
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, maldi, Вы писали:


M>>если имеется в виду это. Так создаётся экземпляр всего класса, а данный параметр явно нигде не создаётся, только объявляется как я писал раньше. И после этого пытаюсь записать объект в БД, заполнив предварительно некоторые поля, за исключением этого.


IT>Я пофиксил инициализацию массивов, теперь должно работать.


Ещё раз благодарю. Теперь всё работает как по маслу.
Re[13]: свойство типа byte[] не маппится
От: Antares19 Россия http://igor-vagin.moikrug.ru/
Дата: 09.12.06 22:24
Оценка:
Здравствуйте, IT, Вы писали:

M>>если имеется в виду это. Так создаётся экземпляр всего класса, а данный параметр явно нигде не создаётся, только объявляется как я писал раньше. И после этого пытаюсь записать объект в БД, заполнив предварительно некоторые поля, за исключением этого.


IT>Я пофиксил инициализацию массивов, теперь должно работать.


Игорь, тут похоже опять что-то не так... у меня аналогичная ситуация, не работает

Имеем:
    public abstract class Person : BaseEntity
    {
        //...
        public abstract byte[] Photo { get; set; }  
    }


Получаю данные с помощью абстрактного Access-ора, им же апдейчу. Все работает нормально, до тех пор пока не пытаюсь сапдетить из объекта в котором Photo = null. Тут сразу же получаю экзепшн из DbManager.OnOperationException: "Operand type clash: nvarchar is incompatible with image". nvarchar-ом пытается залить (в базе MSSQL-евский Image, так же пробовал с varbinary, тот же результат)

Что я только не пробовал, какие атрибуты не вешал... Внешними средствами похоже проблема так просто не решается.

Буду благодарен, за любой совет по тому как обойти, что похакать для этого, итп.
Другой, более правильный вариант мапить в классы картинки из базы — тоже подойдет.
Re: Есть такая буква...
От: Блудов Павел Россия  
Дата: 11.12.06 07:18
Оценка:
Здравствуйте, Antares19!

Есть у MsSqlServer'а такая ...ммм... особенность. Он свято верит, что NULL это строка. Чтобы не быть голословным:

CREATE TABLE BinaryData
(
    BinaryDataID int             NOT NULL IDENTITY(1,1) PRIMARY KEY,
    Data         varbinary(1024) NULL)

Тогда если имеем что-то вроде
public abstract class BinaryData
{
    [MapField("BinaryDataID"), PrimaryKey, NonUpdatable]
    public abstract int       ID   { get; set; }
    [MapIgnore(false)]
    public abstract Byte[]    Data { get; set; }
}

То для, скажем, Insert'а будет выполен код, аналогичный вот этому:
        public void SunsetByHands()
        {
            using (DbManager db = new DbManager())
            {
                db
                    .SetCommand(@"INSERT INTO BinaryData (Data) VALUES (@Data)", db.Parameter("@Data", DBNull.Value))
                    .ExecuteNonQuery();
            }
        }

И вот тут то MsSqlServer делает удивлённые глаза и говорит: "Да вы что делаете со мной, гады! NULL он же имеет тип NVARCHAR! Как же я из него VARBINARY получу-то ".

Дальше есть два момента.
  1. Конструкцию типа INSERT INTO BinaryData (Data) VALUES (NULL)" он понимает.
  2. Чтобы этим воспользоваться, нужно отказаться от привязки параметров.
ИМХО, оно того не стоит.

p.s. Только что обнаружил, что
INSERT INTO BinaryData (Data) VALUES (@Data)", db.Parameter("@Data", SqlBinary.Null)
всё-таки работает.
Так что надежда есть, но пока призрачная.

Мне, например, не ясно, как имея byte[] сообразить, что нужно инициализировать параметр не значением null, не DBNull, а каким-то совершенно левым SqlBinary.Null.
Т.е. нужно как-то узнать, какого типа будет колонка и позволить DataProvider'у выставить нужное значение.
... << RSDN@Home 1.2.0 alpha rev. 642>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.