Проблемы с Dapper и Oracle CRUD, как? - PullRequest
7 голосов
/ 20 марта 2012

Как мне сделать 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

Ответы [ 2 ]

11 голосов
/ 08 июня 2012

Я столкнулся с чем-то похожим, но с помощью оператора 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");
6 голосов
/ 07 февраля 2015

В дополнение к ответу 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");

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

...