RFD: Добавления и исправления версии 1.3
От: IT Россия linq2db.com
Дата: 10.02.04 05:00
Оценка: 20 (3)
Добавления и исправления версии 1.3


SetCommand, SetSpCommand

Основные изменения данной версии коснулись класса DbManager. Из методов Execute... вынесены параметры, отвечающие за формирование выполняемой команды. Так, если вызов метода ExecuteScalar ранее выглядел следующим образом

using (DbManager db = new DbManager())
{
    return (int)db.ExecuteScalar("SELECT Count(*) FROM Categories");
}

то теперь его вызову должен предшествовать вызов метода SetCommand или SetSpCommand:

using (DbManager db = new DbManager())
{
    return (int)db
        .SetCommand("SELECT Count(*) FROM Categories")
        .ExecuteScalar();
}

Старые методы объявлены obsolete и будут удалены в следующей версии библиотеки.

Update

Метод Update представляет собой обёртку для вызова метода DbDataAdapter.Update. Для задания команд вставки обновления и удаления используются соответствующие методы SetInsertCommand, SetUpdateCommand, SetDeleteCommand.

using (DbManager db = new DbManager())
{
    db
        .SetInsertCommand("INSERT statement")
        .SetUpdateCommand("UPDATE statement")
        .SetDeleteCommand("DELETE statement")
        .Update(dataSet);
}

MapTypeAttribute

Данный атрибут обзавёлся набором параметров, которые могут быть переданы конструктору класса, имплементирующего абстрактное свойство. Например:

public abstract class MyBizEntity : BizEntityBase
{
    [MapType(typeof(RequiredString), "Description", 20)]
    public abstract string Description { get; set; }
}

См. полный пример использования данного атрибута в документации.

ISupportInitialize

Если класс, участвующий в маппинге реализует интерфейс ISupportInitialize, то маппер вызовет метод BeginInit перед началом отображения и EndInit перед его завершением.

public class InitializedEntity : ISupportInitialize
{
    private bool _isBeingMapped;

    void ISupportInitialize.BeginInit()
    {
        _isBeingMapped = true;
    }

    void ISupportInitialize.EndInit()
    {
        _isBeingMapped = false;
    }
}

IMapSettable

Данный интерфейс имеет всего лишь один метод – SetField. В процессе отображения поля источника передаются в этот метод одно за другим. Если объект обрабатывает поле самостоятельно, то он должен вернуть true. В противном случае маппер попытается произвести отображение самостоятельно. Следующий пример демонстрирует применение данного интерфейса для реализации свойства ID базового класса бизнес объектов:

public abstract class BizEntityBase : IMapSettable
{
    private Guid _id;
    public  Guid  ID { get { return _id; } }

    bool IMapSettable.SetField(string fieldName, object value)
    {
        if (string.Compare(fieldName, GetType().Name + "ID") == 0)
        {
            _id = (Guid)value;

            return true;
        }

        return false;
    }
}


Спасибо всем принявшим участие в обсуждение библиотеки.
Отдельное спасибо Андрею Касьянову за ценные замечания и предложения.


30.04.04 06:48: Перенесено из '.NET Projects'
Если нам не помогут, то мы тоже никого не пощадим.
Re: Update не работает
От: Wile  
Дата: 15.02.04 23:44
Оценка: 42 (1)
Прошу прощения, может я не так чего делаю, но похоже, что такая конструкция


using (DbManager db = new DbManager())
{
    db
        .SetInsertCommand("INSERT statement")
        .SetUpdateCommand("UPDATE statement")
        .SetDeleteCommand("DELETE statement")
        .Update(dataSet);
}


не работает ...

Я так думаю по следующей причине:

Методы
SetInsertCommand(), SetUpdateCommand(), SetDeleteCommand()

Вызывают следующую цепочку методов:


        private IDbCommand PrepareCommand(
            CommandAction      commandAction,
            CommandType        commandType,
            string             commandText,
            IDbDataParameter[] commandParameters)
        {
            try
            {
                IDbCommand command = GetCommand(commandType, commandText);

            .............



        private IDbCommand GetCommand(CommandType commandType, string sql)
        {
            IDbCommand command = Command;
            
            .............


        public IDbCommand Command
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return SelectCommand; }

            .............


        public IDbCommand SelectCommand
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return _selectCommand = InitCommand(_selectCommand); }


            .............


        private IDbCommand InitCommand(IDbCommand command)
        {
            try
            {
                IDbCommand cmd = command;

                if (cmd == null) 
                {
                    // Create a command object.
                    //
                    cmd = Connection.CreateCommand();



Так вот, условие if (cmd == null) срабатывает ОДИН раз (вместо трех для каждой команды).
В результате _selectCommand, _insertCommand, _updateCommand и _deleteCommand смотрят на один и тот же объект.
Проблема решилась обнулением _selectCommand:


    private IDbCommand GetCommand(CommandType commandType, string sql)
        {
            _selectCommand = null;
            IDbCommand command = Command;
Re[2]: Update не работает
От: Walker США  
Дата: 17.02.04 01:23
Оценка: 42 (1)
Здравствуйте, Wile, Вы писали:

W>Прошу прощения, может я не так чего делаю, но похоже, что такая конструкция

W>не работает ...

Я вот только что хотел запостить эту же самую проблему

W>
W>    private IDbCommand GetCommand(CommandType commandType, string sql)
W>        {
W>            _selectCommand = null;
W>            IDbCommand command = Command;
W>


Это временный фикс, не совсем корректный. Правильным решением будет сделать еще одну ф-ю:
private IDbCommand GetCommand(CommandAction commandAction, CommandType commandType, string sql)
{
    IDbCommand command = GetCommand(commandAction);

    command.Parameters.Clear();
    command.CommandType = commandType;
    command.CommandText = sql;

    return command;
}

тело ф-и
private IDbCommand GetCommand(CommandType commandType, string sql)

переделать на
{
    return GetCommand(CommandAction.Select, commandType, sql);
}

И в PrepareCommand() переделать вызов GetCommand() на новую версию с тремя параметрами, тогда все будет чики-чики. В принципе ф-ю GetCommand() с двумя параметрами можно вообще выкинуть, она по-моему все равно больше нигде не используется, но это по желанию.

IT, схалявил на тестах? Надо теперь выпускать версию с фиксом. Так глядишь, разрастешься и на automatic updates придется переходить
Re[3]: Update не работает
От: IT Россия linq2db.com
Дата: 17.02.04 02:34
Оценка:
Здравствуйте, Walker, Вы писали:

W>IT, схалявил на тестах?


Признаюсь, схалявил... первый раз в жизни

W>Надо теперь выпускать версию с фиксом. Так глядишь, разрастешься и на automatic updates придется переходить


Придётся
Если нам не помогут, то мы тоже никого не пощадим.
Re: RFD: Добавления и исправления версии 1.3
От: IT Россия linq2db.com
Дата: 24.02.04 03:15
Оценка:
Здравствуйте, IT, Вы писали:

Точно. Было дело.

Исправлены замеченные баги версии 1.3. Спасибо всем за участие.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Проблема с Xml Mapping
От: Павел Бондарчук  
Дата: 15.03.04 19:37
Оценка:
Здравствуйте, IT, Вы писали:

IT>Добавления и исправления версии 1.3


У меня не работает следующий фрагмент (ошибка при компиляции)
Я специально упростил код до предела:



using System;
using Rsdn.Framework.Data;
using Rsdn.Framework.Data.Mapping;

namespace ConsoleApp
{
    public enum TriState
    {
        Yes,
        No,
        NotApplicable
    };

    public class TestMap
    {
        [STAThread]
        static void Main(string[] args)
        {
            TestMap.TestChangeType();
        }


        public static void TestChangeType()
        {
            MapDescriptor.SetMappingSchema(@"D:\Projects\Research\RSDNTest\Mapping.xml");
        }
    }
}


а вот XML

<?xml version="1.0" encoding="utf-8" ?>

<mapping xmlns="http://www.rsdn.ru/mapping.xsd">
    <value_type name="TriState ">
        <value target="Yes" source="yes" source_type="System.String" />
        <value target="No" source="no" source_type="System.String" />
        <value target="NotApplicable" source="(n/a)" source_type="System.String" />
        <null_value target="NotApplicable" />
        <default_value target="NotApplicable" />
    </value_type>
</mapping>



а вот сообщение

An unhandled exception of type 'Rsdn.Framework.Data.Mapping.RsdnMapException' occurred in rsdn.framework.data.dll

Additional information: Error during parsing the 'D:\Projects\Research\RSDNTest\Mapping.xml' file: The 'name' attribute is not declared. An error occurred at , (3, 14).
Re[2]: Проблема с Xml Mapping
От: IT Россия linq2db.com
Дата: 16.03.04 03:26
Оценка:
Здравствуйте, Павел Бондарчук, Вы писали:

ПБ>У меня не работает следующий фрагмент (ошибка при компиляции)


Глючок в XSD схеме. Строка 44 должна выглядеть следующим образом:

<xs:attribute name="name" form="unqualified" type="xs:string" use="required" />
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Проблема с Xml Mapping
От: Павел Бондарчук  
Дата: 17.03.04 07:02
Оценка:
Здравствуйте, IT, Вы писали:


IT>Глючок в XSD схеме. Строка 44 должна выглядеть следующим образом:


IT>
IT><xs:attribute name="name" form="unqualified" type="xs:string" use="required" />
IT>



Спасибо.
Re[3]: Проблема с Xml Mapping
От: Павел Бондарчук  
Дата: 19.03.04 23:14
Оценка:
Здравствуйте, IT, Вы писали:

IT>Глючок в XSD схеме. Строка 44 должна выглядеть следующим образом:


IT>
IT><xs:attribute name="name" form="unqualified" type="xs:string" use="required" />
IT>


А потом я делаю так


using System;
using Rsdn.Framework.Data;
using Rsdn.Framework.Data.Mapping;

namespace ConsoleApp
{
    public enum TriState     {Yes, No, NotApplicable};

    public class TestMap
    {
        [STAThread]
        static void Main(string[] args)
        {
            TestMap.TestChangeType();
        }

        public class Src
        {
            public string Field1 = "no";
        }

        [MapXml("Dest")]
        public class Dest
        {
            private TriState _f1 = TriState.NotApplicable;

            public TriState Field1
            {
                get
                {
                    return _f1;
                }
                set
                {
                    _f1 = value;
                }
            }
        }

        public static void TestChangeType()
        {
            MapDescriptor.SetMappingSchema(@"D:\Projects\Research\RSDNTest\Mapping.xml");
            Src  s = new Src();
            Dest d = (Dest)Map.ToObject(s, typeof(Dest));

            string temp = d.Field1.ToString();
            Console.WriteLine(temp);
        }
    }
}



<?xml version="1.0" encoding="utf-8" ?>
<mapping xmlns="http://www.rsdn.ru/mapping.xsd">
    <type name="Dest">
    </type>
    <value_type name="TriState ">
        <value target="Yes" source="yes" source_type="System.String" />
        <value target="No" source="no" source_type="System.String" />
        <value target="NotApplicable" source="(n/a)" source_type="System.String" />
        <null_value target="NotApplicable" />
        <default_value target="NotApplicable" />
    </value_type>
</mapping>


И получаю:

An unhandled exception of type 'Rsdn.Framework.Data.Mapping.RsdnMapException' occurred in rsdn.framework.data.dll

Additional information: Cannot assign value 'no' of 'String' type to 'Dest.Field1'. Input string was not in a correct format.
Re: RFD: Добавления и исправления версии 1.3
От: orangy Россия
Дата: 21.03.04 23:03
Оценка:
Здравствуйте, IT, Вы писали:

Использовал старый RFD, сегодня проапдейтился и это чудо стало отстреливать студию намертво, в режиме дебуга.
Вот в этой функции:
        object IMapDataSource.GetFieldValue(int i, object entity)
        {
            return ((IMemberMapper)_memberList[i]).GetValue(entity);
        }

Причём неважно, делаешь ли вход внутрь, или step over, или просто брякпоинт ставишь — после выполнения этой строчки в каком-то режиме студии становится очень плохо. Причём оно много раз выполняется нормально, но однажды, в совершенно конкретный момент, отстреливается. Пытаюсь поймать, в чём же дело...
... << RSDN@Home 1.1.3 beta 2 >>
"Develop with pleasure!"
Re: Xml Mapping - всё равно не работает
От: Павел Бондарчук  
Дата: 22.03.04 17:09
Оценка:
А потом я делаю так


using System;
using Rsdn.Framework.Data;
using Rsdn.Framework.Data.Mapping;

namespace ConsoleApp
{
    public enum TriState     {Yes, No, NotApplicable};

    public class TestMap
    {
        [STAThread]
        static void Main(string[] args)
        {
            TestMap.TestChangeType();
        }

        public class Src
        {
            public string Field1 = "no";
        }

        [MapXml("Dest")]
        public class Dest
        {
            private TriState _f1 = TriState.NotApplicable;

            public TriState Field1
            {
                get
                {
                    return _f1;
                }
                set
                {
                    _f1 = value;
                }
            }
        }

        public static void TestChangeType()
        {
            MapDescriptor.SetMappingSchema(@"D:\Projects\Research\RSDNTest\Mapping.xml");
            Src  s = new Src();
            Dest d = (Dest)Map.ToObject(s, typeof(Dest));

            string temp = d.Field1.ToString();
            Console.WriteLine(temp);
        }
    }
}




Вот XML:

<?xml version="1.0" encoding="utf-8" ?>
<mapping xmlns="http://www.rsdn.ru/mapping.xsd">
    <type name="Dest">
    </type>
    <value_type name="TriState ">
        <value target="Yes" source="yes" source_type="System.String" />
        <value target="No" source="no" source_type="System.String" />
        <value target="NotApplicable" source="(n/a)" source_type="System.String" />
        <null_value target="NotApplicable" />
        <default_value target="NotApplicable" />
    </value_type>
</mapping>




И получаю:

An unhandled exception of type 'Rsdn.Framework.Data.Mapping.RsdnMapException' occurred in rsdn.framework.data.dll

Additional information: Cannot assign value 'no' of 'String' type to 'Dest.Field1'. Input string was not in a correct format.
Re[2]: Xml Mapping - всё равно не работает
От: IT Россия linq2db.com
Дата: 23.03.04 05:09
Оценка:
Здравствуйте, Павел Бондарчук, Вы писали:

ПБ>И получаю:


Глюк. Постараюсь побыстрее пофиксить.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: RFD: Добавления и исправления версии 1.3
От: vdimas Россия  
Дата: 10.01.05 11:39
Оценка:
Здравствуйте, orangy, Вы писали:

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


O>Использовал старый RFD, сегодня проапдейтился и это чудо стало отстреливать студию намертво, в режиме дебуга.

O>Вот в этой функции:
O>
O>        object IMapDataSource.GetFieldValue(int i, object entity)
O>        {
O>            return ((IMemberMapper)_memberList[i]).GetValue(entity);
O>        }
O>

O>Причём неважно, делаешь ли вход внутрь, или step over, или просто брякпоинт ставишь — после выполнения этой строчки в каком-то режиме студии становится очень плохо. Причём оно много раз выполняется нормально, но однажды, в совершенно конкретный момент, отстреливается. Пытаюсь поймать, в чём же дело...

случайно не value type используешь как entity?
у меня было похожее, валится не студия, а вообще весь дотнет валится и говорит, что испортили среду выполнения.
Re[3]: RFD: Добавления и исправления версии 1.3
От: orangy Россия
Дата: 10.01.05 12:31
Оценка:
Здравствуйте, vdimas, Вы писали:

V>случайно не value type используешь как entity?

Нет.
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
"Develop with pleasure!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.