NullValue - неверное понимание или бага?
От: Clerk  
Дата: 21.03.11 10:05
Оценка:
В SqlServer есть таблица:
create table TEST123
(
  WEBAPP_ID int,
  DD_AMOUNT money
)


В BLToolkit заведён класс:
  [TableName("TEST123")]
  public abstract class Test123
  {
    [MapField("WEBAPP_ID"), PrimaryKey(0)]
    public abstract int Id { get; set; }

    [MapField("DD_AMOUNT"), NullValue(0), DbType(DbType.Currency)]
    public abstract double DirectDebitAmount { get; set; }
  }


Далее есть код, который вставляет item:
      using (DbManager db = new DbManager())
      {
        Test123 item = TypeAccessor<Test123>.CreateInstanceEx();
        item.Id = 3;
        item.DirectDebitAmount = 0;
        SqlQuery<Test123> query = new SqlQuery<Test123>();
        query.Insert(db, item);
      }


Но здесь в SqlServer вылетает ошибка, так как BLToolkit "генерит" след. sql:
exec sp_executesql N'INSERT INTO [TEST123]
 (
    [WEBAPP_ID],
    [DD_AMOUNT]
) VALUES (
    @WEBAPP_ID_P,
    @DD_AMOUNT_P
)',N'@WEBAPP_ID_P int,@DD_AMOUNT_P money',@WEBAPP_ID_P=3,@DD_AMOUNT_P=default



вместо(как я полагаю):
exec sp_executesql N'INSERT INTO [TEST123]
 (
    [WEBAPP_ID],
    [DD_AMOUNT]
) VALUES (
    @WEBAPP_ID_P,
    @DD_AMOUNT_P
)',N'@WEBAPP_ID_P int,@DD_AMOUNT_P money',@WEBAPP_ID_P=3,@DD_AMOUNT_P=NULL



Вероятно (я не очень разбираюсь во внутренностях BLToolkit), что это можно исправить так:
diff --git a/Tools/BLToolkit/DataAccess/SqlQueryInfo.cs b/Tools/BLToolkit/DataAccess/SqlQueryInfo.cs
index 0eddf30..d7931d5 100644
--- a/Tools/BLToolkit/DataAccess/SqlQueryInfo.cs
+++ b/Tools/BLToolkit/DataAccess/SqlQueryInfo.cs
@@ -83,7 +83,7 @@ namespace BLToolkit.DataAccess
                 MapMemberInfo mmi = info.MemberMapper.MapMemberInfo;
                 object        val = info.MemberMapper.GetValue(obj);
 
-                if (val == null && mmi.Nullable && mmi.NullValue == null)
+                if (val == null && mmi.Nullable /* && mmi.NullValue == null */)
                 {
                     //replace value with DbNull
                     val = DBNull.Value;
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re: NullValue - неверное понимание или бага?
От: ili Россия  
Дата: 21.03.11 10:15
Оценка:
Здравствуйте, Clerk, Вы писали:

попробуйте так:

C>В BLToolkit заведён класс:

C>
  [TableName("TEST123")]
C>  public abstract class Test123
C>  {
C>    [MapField("WEBAPP_ID"), PrimaryKey(0)]
C>    public abstract int Id { get; set; }

C>    [MapField("DD_AMOUNT"), NullValue((double)0), Nullable DbType(DbType.Currency)]
C>    public abstract double DirectDebitAmount { get; set; }
C>  }
C>
Re[2]: NullValue - неверное понимание или бага?
От: Clerk  
Дата: 21.03.11 10:23
Оценка:
Здравствуйте, ili, Вы писали:

Не помогает:
exec sp_executesql N'INSERT INTO [TEST123]
 (
    [WEBAPP_ID],
    [DD_AMOUNT]
) VALUES (
    @WEBAPP_ID_P,
    @DD_AMOUNT_P
)',N'@WEBAPP_ID_P int,@DD_AMOUNT_P money',@WEBAPP_ID_P=3,@DD_AMOUNT_P=default


ili>попробуйте так:


C>>В BLToolkit заведён класс:

C>>
  [TableName("TEST123")]
C>>  public abstract class Test123
C>>  {
C>>    [MapField("WEBAPP_ID"), PrimaryKey(0)]
C>>    public abstract int Id { get; set; }

C>>    [MapField("DD_AMOUNT"), NullValue((double)0), Nullable DbType(DbType.Currency)]
C>>    public abstract double DirectDebitAmount { get; set; }
C>>  }
C>>
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.