Problèmes avec Dapper et Oracle CRUD, comment faire?

c#-4.0 crud dapper

Question

Comment puis-je rendre Dapper.NET à CRUD ma base de données Oracle?

J'ai la table nommée: PLAYER_LOG son identité se fait par trigger, voici le sql

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

mon modèle est:

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

voici mon encart:

 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
            });
 }

voici l'exception:

ORA-01008: not all variables bound

Réponse acceptée

J'ai rencontré quelque chose d'un peu similaire, mais en utilisant la déclaration de retour. Le truc que j'ai trouvé était d'utiliser l'objet DynamicParameters. Dans le système que j'utilise, les instructions d'insertion doivent invoquer NextVal sur la séquence, il n'est pas dans un déclencheur.

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");

Réponse populaire

En plus de la réponse de bwalk2895, vous pouvez également transmettre votre objet de modèle au constructeur de DynamicParameters, puis vous devez uniquement ajouter les paramètres de sortie. Enregistre quelques lignes de code, en particulier pour les objets avec de nombreuses propriétés. Exemple:

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");

update: nom de la méthode corrigée




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi