Проблемы Dapper и Oracle CRUD, как решить?

Как мне сделать Dapper.NET для CRUD моей БД Oracle?

У меня есть таблица с именем: PLAYER_LOG ее идентификация выполняется с помощью триггера, вот sql

SELECT SQ_MASTER_SEQUENCE.NEXTVAL INTO tmpVar FROM dual;
:NEW.ID := tmpVar;

моя модель:

public class PlayerLogStorage : IEntity //-> here is the identity
{       
    public string Cli { get; set; }
    public string PlayerAnswer { get; set; }
    public DateTime InsertDate { get; set; }
}

вот моя вставка:

 using (IDbConnection ctx = DbConnectionProvider.Instance.Connection)
 {
            ctx.Query<PlayerLogStorage>("INSERT INTO PLAYER_LOG (CLI, ANSWER, INSERT_DATE) VALUES (:Cli, :PlayerAnswer, :InsertDate)", new
            {
                Cli = model.Cli,
                PlayerAnswer = model.PlayerAnswer,
                InsertDate = model.InsertDate
            });
 }

вот исключение:

ORA-01008: not all variables bound

person IamStalker    schedule 20.03.2012    source источник


Ответы (2)


Я столкнулся с чем-то похожим, но с оператором return. Уловка, которую я нашел, заключалась в использовании объекта DynamicParameters. В системе, которую я использую, операторы вставки должны вызывать NextVal для последовательности, а не в триггере.

var param = new DynamicParameters();

param.Add(name: "Cli", value: model.Cli, direction: ParameterDirection.Input);
param.Add(name: "PlayerAnswer", value: model.PlayerAnswer, direction: ParameterDirection.Input);
param.Add(name: "InsertDate", value: model.InsertDate, direction: ParameterDirection.Input);
param.Add(name: "Id", dbType: DbType.Int32, direction: ParameterDirection.Output);

using (IDbConnection ctx = DbConnectionProvider.Instance.Connection)
{
    ctx.Execute("INSERT INTO PLAYER_LOG (CLI, ANSWER, INSERT_DATE) VALUES (:Cli, :PlayerAnswer, :InsertDate) returning Id into :Id", paramList);
}

var Id = param.get<int>("Id");
person bwalk2895    schedule 08.06.2012
comment
Спасибо, я проверю, есть ли у вас еще примеры использования с Oracle? - person IamStalker; 09.06.2012
comment
Я уже некоторое время экспериментирую с совместным использованием Dapper и Oracle и нашел способы обойти ряд причуд... если у вас есть конкретный вопрос, я буду рад ответить. - person bwalk2895; 14.06.2012
comment
отличный ответ @bwalk2895 :) помогите мне много :) в настоящее время я использую dapper с оракулом :) - person danywalls; 11.06.2013
comment
@bwalk2895 bwalk2895 как ты вставил строку в тип clob? Я использую OracleDynamicParameter и столкнулся с этой проблемой stackoverflow.com/questions/23145558. У вас есть идеи? - person Timeless; 07.08.2014
comment
@Timeless Извините, я сменил работу больше года назад и с тех пор не использовал Oracle. Весь код, который я написал для того, чтобы заставить Oracle работать с Dapper.NET, находится на моей старой работе. Одна вещь, которую я помню, это попытаться создать proc/package, который принимает varchar, и заставить этот proc/package преобразовать его в CLOB. - person bwalk2895; 08.08.2014

В дополнение к ответу bwalk2895 вы также можете передать объект своей модели конструктору DynamicParameters, а затем вам нужно будет только добавить выходные параметры. Экономит несколько строк кода, особенно для объектов с большим количеством свойств. Пример:

var param = new DynamicParameters(model);

param.Add(name: "Id", dbType: DbType.Int32, direction: ParameterDirection.Output);

using (IDbConnection ctx = DbConnectionProvider.Instance.Connection)
{
    ctx.Execute("INSERT INTO PLAYER_LOG (CLI, ANSWER, INSERT_DATE) VALUES (:Cli, :PlayerAnswer, :InsertDate) returning Id into :Id", param);
}

var Id = param.Get<int>("Id");

обновление: исправлено имя метода

person John Galambos    schedule 06.02.2015