DbManager db = new DbManager()
db.SetCommand(@"
UPDATE people SET
firstname=@firstname,
lastname=@lastname
WHERE
id=@id
",
db.Parameter("@firstname", "barabashka"),
db.Parameter("@lastname", "karabashka"),
db.Parameter("@middlename", 10)
);
Не работает.
Если в запросе "@..." заменить на "?" — работает.
Если вместо db.Parameter... вызывать db.CreateParameters — не работает.
Если команду UPDATE заменить на INSERT — всё работает с поименованными параметрами.
Здравствуйте, IT, Вы писали:
kuu>>В том-то и дело, что никакого. kuu>>Он молча проглатывает и ничего не говорит.
IT>Попробуй написать запрос без RFD, просто на ADO.NET, и дай сюда код посмотреть. IT>RFD просто рапер, они ничем недозволенным не занимается.
Только студию роняет, если случается исключение или брякпоинт во время маппинга, а так да, ничем
Здравствуйте, orangy, Вы писали:
IT>>RFD просто рапер, они ничем недозволенным не занимается. O>Только студию роняет, если случается исключение или брякпоинт во время маппинга, а так да, ничем
Ни разу такого не видел. Можно по подробнее?
... << Rsdn@Home 1.1.4 beta 1 >>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>>>RFD просто рапер, они ничем недозволенным не занимается. O>>Только студию роняет, если случается исключение или брякпоинт во время маппинга, а так да, ничем
IT>Ни разу такого не видел. Можно по подробнее?
Ставлю бряк в сеттере, во время маппинга бряк срабатывает, а потом студия падает... Возможно влияет то, что у меня включено Show non-user code in call stack.
Кстати, мы тут малость похачили:
1. ISupportInitialize для коллекций
2. Добавили DbManager.CloseCommand — освобождает команды, но не закрывает коннекшн, для "пулирования" соединения.
И что-то еще по мелочи, не помню.
Здравствуйте, orangy, Вы писали:
O>Кстати, мы тут малость похачили:
это интересно, тоже над этим не так давно начал задумываться Можно это где-то глянуть? Ну и сам тоже могу поделиться кое-чем У меня добавлен синтаксис
public abstract class TestObject
{
public abstract string Name { get; set; }
public abstract event EventHandler NameChanged;
}
Здравствуйте, SiAVoL, Вы писали:
O>>Кстати, мы тут малость похачили: SAV>это интересно, тоже над этим не так давно начал задумываться Можно это где-то глянуть? Ну и сам тоже могу поделиться кое-чем У меня добавлен синтаксис
Мы не пользуемся абстрактными сущностями, бизнес-логика нетривиальная. А насчёт XXXChanged — у меня другая система, расширение компонентной модели IBindingObject в пару к IBindingCollection.
SAV>ЗЫ: RFD-хакеры объединяйтесь!
Посмотрим, посмотрим
Здравствуйте, orangy, Вы писали:
O>насчёт XXXChanged — у меня другая система, расширение компонентной модели IBindingObject в пару к IBindingCollection.
То-бишь свой биндинг написан? Млин, тоже в последнее время все чаще появляются такие мысли. А то стандартный дикий какой-то, пака еще отделываюсь от него подпорками да костылями, а что дальше будет...
Здравствуйте, SiAVoL, Вы писали:
SAV>Здравствуйте, orangy, Вы писали:
O>>насчёт XXXChanged — у меня другая система, расширение компонентной модели IBindingObject в пару к IBindingCollection. SAV>То-бишь свой биндинг написан? Млин, тоже в последнее время все чаще появляются такие мысли. А то стандартный дикий какой-то, пака еще отделываюсь от него подпорками да костылями, а что дальше будет...
Честный свой биндинг написать невозможно — необходимые методы и классы хоть и есть, и виртуальны, но увы являются internal. Кроме того, во многих местах создание CurrencyManager запихано прямо в код и подменить его нет возможности. Я этот вопрос подробно изучал, так что увы... А IBindingObject нужен по другой причине. У IBindingList есть событие ListChanged, и есть вариант, что ItemChanged. Так вот мои реализации коллекций умеют понимать IBO, подписываться на изменения в бизнес сущностях и поднимать соотв. события. Таким образом, изменение объектов "доходит" до прибинденых контролов моментально.
ЗЫ: Вообще, есть настойчивое желание переписать System.Windows.Forms... Бью себя по рукам...
Здравствуйте, orangy, Вы писали:
O>Мы не пользуемся абстрактными сущностями, бизнес-логика нетривиальная.
Кстати о нетривиальной логике. У вас присутствую какие-либо связи между бизнес-объектами? И если да, то как вы их реализуете в рамках RFD?
Здравствуйте, SiAVoL, Вы писали:
SAV>Здравствуйте, orangy, Вы писали:
O>>Мы не пользуемся абстрактными сущностями, бизнес-логика нетривиальная. SAV>Кстати о нетривиальной логике. У вас присутствую какие-либо связи между бизнес-объектами? И если да, то как вы их реализуете в рамках RFD?
Ну конечно присутствуют Интересная была бы система бизнес-сущностей без связей между ними...
Честно говоря, этим уровнем занимаюсь не я, поэтому подробно ответить не могу. Могу сказать только, что бОльшая часть связей реализуется подгрузкой on-demand. Там еще сохранение изменений (в т.ч. связей, включая М:М), кэш прикручен и еще куча всякой ерунды...
Здравствуйте, orangy, Вы писали:
O>Честно говоря, этим уровнем занимаюсь не я, поэтому подробно ответить не могу.
жаль, мне было бы интересно. Я как раз сейчас этим занимаюсь O>Могу сказать только, что бОльшая часть связей реализуется подгрузкой on-demand. Там еще сохранение изменений (в т.ч. связей, включая М:М), кэш прикручен и еще куча всякой ерунды...
Ну у меня тоже подгрузка по запросу (хотя бы потому, что так легче ) с сохранениями и кэшами (что там без кэша то делать?). Связи я делаю на атрибутах у абстрактных классов бизнес-объектов. Единственное, что мне не нравится так это то, что при этом приходится активно модифицировать кодогенератор RFD . Боюсь с новой версией придетсчя долго сливать изменения. К нему бы какую-нибудь систему плугинов прикрутить, что бы я мог зарегать свои атрибуты и генерить код сам. Эх мечты, мечты... Или они могут стать реальностью? А, IT?
Здравствуйте, orangy, Вы писали:
IT>>Ни разу такого не видел. Можно по подробнее? O>Ставлю бряк в сеттере, во время маппинга бряк срабатывает, а потом студия падает... Возможно влияет то, что у меня включено Show non-user code in call stack.
Будем искать...
O>Кстати, мы тут малость похачили: O>1. ISupportInitialize для коллекций
Это как? Откуда там коллекции?
O>2. Добавили DbManager.CloseCommand — освобождает команды, но не закрывает коннекшн, для "пулирования" соединения.
Пулить соединения — это не по-пацански
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, orangy, Вы писали:
SAV>>это интересно, тоже над этим не так давно начал задумываться Можно это где-то глянуть? Ну и сам тоже могу поделиться кое-чем У меня добавлен синтаксис
O>Мы не пользуемся абстрактными сущностями, бизнес-логика нетривиальная. А насчёт XXXChanged — у меня другая система, расширение компонентной модели IBindingObject в пару к IBindingCollection.
С абстрактными классами внутренняя реализация сущностей легко расширяется с помощью MapType атрибута.
Вот пример из хелпа:
/// example:
/// maptype ctor(Type)
/// comment:
/// The following example demonstrates how to use the <b>MapTypeAttribute</b> attribute.using System;
using NUnit.Framework;
using Rsdn.Framework.Data.Mapping;
namespace Examples_Mapping_MapTypeAttribute
{
[TestFixture]
public class ctor_Type
{
public class MyInt1
{
public int Value { get { return 1; } }
}
public class MyInt2
{
public int Value { get { return 2; } }
}
public class MyInt3
{
public int Value { get { return 3; } }
}
[MapType(typeof(int), typeof(MyInt2))]
public abstract class BaseEntity
{
}
public interface IEntity
{
[MapType(typeof(MyInt3))]
int Property3 { get; }
}
public abstract class TestEntity : BaseEntity, IEntity
{
// Implementation property type is set explicitly.
//
[MapType(typeof(MyInt1))]
public abstract int Property1 { get; }
// Implementation type is taken from BaseEntity.
// MyInt2 is propagated to all current and child classes properties of int type.
//public abstract int Property2 { get; }
// Implementation type is taken from IEntity.
// This way has higher priority than previous one.
//public abstract int Property3 { get; }
}
[Test]
public void Test()
{
TestEntity te = (TestEntity)Map.Descriptor(typeof(TestEntity)).CreateInstance();
Assert.AreEqual(1, te.Property1);
Assert.AreEqual(2, te.Property2);
Assert.AreEqual(3, te.Property3);
}
}
}
На базовый класс можно повесить маппинг базовых типов и в наследниках их вообще не нужно будет указывать.
Или я не о том?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, SiAVoL, Вы писали:
SAV>ЗЫ: RFD-хакеры объединяйтесь!
Есть другая идея. Я всегда был против создания полноценного ORM, но можно в рамках Rsdn.Framework.Data сделать namespace Template или Pattern и наложить в него заготовок для создания собственных кастомных решений.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
O>>Кстати, мы тут малость похачили: O>>1. ISupportInitialize для коллекций IT>Это как? Откуда там коллекции?
Ну когда List выгребаешь...
O>>2. Добавили DbManager.CloseCommand — освобождает команды, но не закрывает коннекшн, для "пулирования" соединения. IT>Пулить соединения — это не по-пацански
Поясни?
Здравствуйте, orangy, Вы писали:
O>>>2. Добавили DbManager.CloseCommand — освобождает команды, но не закрывает коннекшн, для "пулирования" соединения. IT>>Пулить соединения — это не по-пацански O>Поясни?
Соединение нужно просто закрывать и всё. ADO.NET само справляется с пулингом не плохо.
... << Rsdn@Home 1.1.4 beta 1 >>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, orangy, Вы писали: O>Честно говоря, этим уровнем занимаюсь не я, поэтому подробно ответить не могу. Могу сказать только, что бОльшая часть связей реализуется подгрузкой on-demand. Там еще сохранение изменений (в т.ч. связей, включая М:М), кэш прикручен и еще куча всякой ерунды...
Блин, ткните мне пальцем в тех, кто этим не занимается... Что-то походу ORM.NET нынче есть самый популярный спорт.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.