RETURNING
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.04.08 17:18
Оценка:
А почему запись вставляется, в БД ID наращивается, но после выполнения msg.ID все равно 0?

    public class MessageData
    {
        [MapField("ID")]
        public Int64 ID;

        [MapField("CALL_ID")]
        public string CallID;
    }

    OracleDataProvider p = new OracleDataProvider();
    p.ParameterPrefix = null;
    DbManager.AddDataProvider(p);
    DbManager.AddConnectionString("Oracle", "Data Source=alias;User ID=user;Password=password;");

    MessageData msg = new MessageData();
    msg.CallID = "lsakxnsaljknsalk";

    using(DbManager db = new DbManager())
    {
        db
            .SetCommand(@"
                      INSERT INTO SUP_AUDIO_MESSAGE
                            ( ID, CALL_ID ) 
                      VALUES 
                            ( SUP_AUDIO_SEQ.NEXTVAL, :CALL_ID )
                      RETURNING ID INTO :ID", 
                  db.CreateParameters(msg))
      .ExecuteNonQuery();
    }
... << RSDN@Home 1.2.0 alpha 4 rev. 1084>>
RETURNING
От: Блудов Павел Россия  
Дата: 30.04.08 00:26
Оценка: 28 (1)
#Имя: FAQ.rfd.oracle.returning
Здравствуйте, Odi$$ey, Вы писали:

OE>А почему запись вставляется, в БД ID наращивается, но после выполнения msg.ID все равно 0?


OE>
OE> using(DbManager db = new DbManager())
OE>    {
OE>        db
OE>            .SetCommand(@"
OE>                      INSERT INTO SUP_AUDIO_MESSAGE
OE>                            ( ID, CALL_ID ) 
OE>                      VALUES 
OE>                            ( SUP_AUDIO_SEQ.NEXTVAL, :CALL_ID )
OE>                      RETURNING ID INTO :ID", 
OE>                  db.CreateParameters(msg))
OE>      .ExecuteNonQuery();
OE>    }
OE>


Мда, телепатический модуль BLToolkit'а нужно переписывать с нуля.

А пока можно явно указать, что параметр ID должен вернуться с сервера.
Кстати, то, что его нужно отмапить обратно в msg тоже нужно указать явно:

using(DbManager db = new DbManager())
{
    db
        .SetCommand(@"
                    INSERT INTO SUP_AUDIO_MESSAGE
                        ( ID, CALL_ID ) 
                    VALUES 
                        ( SUP_AUDIO_SEQ.NEXTVAL, :CALL_ID )
                    RETURNING ID INTO :ID", 
                db.CreateParameters(msg, new string[] { "ID" }, null, null))
        .ExecuteNonQuery(msg);
}


Дополнительные примеры можно подсмотреть здесь.
... << RSDN@Home 1.2.0 alpha 2 rev. 872>>
bltoolkit rfd oracle returning
Re[2]: RETURNING
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 30.04.08 03:22
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>А пока можно явно указать, что параметр ID должен вернуться с сервера.

БП>Кстати, то, что его нужно отмапить обратно в msg тоже нужно указать явно:

БП>
БП>using(DbManager db = new DbManager())
БП>{
БП>    db
БП>        .SetCommand(@"
БП>                    INSERT INTO SUP_AUDIO_MESSAGE
БП>                        ( ID, CALL_ID ) 
БП>                    VALUES 
БП>                        ( SUP_AUDIO_SEQ.NEXTVAL, :CALL_ID )
БП>                    RETURNING ID INTO :ID", 
БП>                db.CreateParameters(msg, new string[] { "ID" }, null, null))
БП>        .ExecuteNonQuery(msg);
БП>}
БП>


сделал так, запись вставляется, но ID в msg всегда 0
Re[3]: RETURNING
От: Блудов Павел Россия  
Дата: 30.04.08 03:26
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

БП>>
БП>>    db
БП>>        .SetCommand(@"
БП>>        .ExecuteNonQuery(msg);
БП>>


OE>сделал так, запись вставляется, но ID в msg всегда 0


Значит нужно пройтись отладчиком через ExecuteNonQuery (точнее через MapOutputParameters) и посмотреть что с чем разъехалось.
Re[4]: RETURNING
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 30.04.08 03:46
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Значит нужно пройтись отладчиком через ExecuteNonQuery (точнее через MapOutputParameters) и посмотреть что с чем разъехалось.


хм, в CreateParameters() ID добавляется в paramList с Direction = ParameterDirection.Output, но ни в какие DbManager::MapOutputParameters программа ни до ни после не попадает

з.ы. BLToolkit у меня r574 из http://bl-toolkit.googlecode.com/svn/trunk
Re[5]: RETURNING
От: Блудов Павел Россия  
Дата: 30.04.08 03:50
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>но ни в какие DbManager::MapOutputParameters программа ни до ни после не попадает


А в DbManager::ExecuteNonQuery(object obj) попадает или нет?
Если нет, но попадает в DbManager::ExecuteNonQuery(), то очень-очень внимательно перечитай вот это
Автор: Блудов Павел
Дата: 30.04.08
сообщение
Re[5]: RETURNING
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 30.04.08 03:50
Оценка:
OE>хм, в CreateParameters() ID добавляется в paramList с Direction = ParameterDirection.Output, но ни в какие DbManager::MapOutputParameters программа ни до ни после не попадает

а, стоп, сам дурак, в ExecuteNonQuery msg не вписал
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.