Dapper 1.42 y Sybase.AdoNet45.AseClient no inserta variables de cadena

asp.net c# dapper database sybase

Pregunta

Salir de Sybase no es una opción y el requisito es compartir el estado de la sesión entre varias aplicaciones web .NET. Me han encomendado la tarea de crear un SessionStateStoreProvider que funcione con Sybase.

Estamos utilizando Sybase ASE 15.0, ASP.NET 4.61, es una aplicación web de mvc. Creé una biblioteca de modelos y una biblioteca de repositorios para acceder a la base de datos. La biblioteca de repositorio contiene una clase base para métodos comunes, etc. para acceder a la base de datos. Usando Dapper 1.42 y Sybase.AdoNet45.AseClient.

Esta es la clase de modelo que representa la tabla de la base de datos para los campos de estado de la sesión. Cambié la tabla para que todas las columnas marcadas como varchar y varbinary permitan datos nulos.

public class AspNetSession
{
    public string SessionId { get; set; }
    public string ApplicationName { get; set; }
    public DateTime Created { get; set; }
    public DateTime Expires { get; set; }
    public DateTime LockDate { get; set; }
    public bool Locked { get; set; }
    public int LockId { get; set; }
    public int Timeout { get; set; }
    public int Flags { get; set; }
    public string SessionItems { get; set; }
}

Este es el código que necesito escribir para hacer una operación de base de datos. En este caso, estoy intentando insertar. El comando Insertar parece que funciona y devuelve un registro de datos agregado a la base de datos, pero cuando examino la base de datos, la tabla tiene un registro insertado, pero todos los campos de cadena en la base de datos están configurados como nulos.

public int Insert( AspNetSession session )
{
    const string sqlCmd = "insert into dbo.AspNetSessions " + 
                          "(SessionId, ApplicationName, Created, Expires, LockDate, Locked, LockId, Timeout, Flags, SessionItems ) " +
                          "Values(@SessionId, @ApplicationName, @Created, @Expires, @LockDate, @Locked, @LockId, @Timeout, @Flags, @SessionItems ) ";

    return Connection.Execute( sqlCmd, session );
}

También intenté pasar los parámetros usando el nuevo {...}, con los mismos resultados.

return Connection.Execute( sqlCmd, new { session.SessionId,
                                         session.ApplicationName,
                                         session.Created,
                                         session.Expires,
                                         session.LockDate,
                                         session.Locked,
                                         session.LockId,
                                         session.Timeout,
                                         session.Flags,
                                         session.SessionItems } );

Probé el siguiente código (también lo intenté sin el símbolo @ delante del parámetro de nombre). Me sale la excepción

Sybase.Data.AseClient.AseException: debe declarar la variable '@SessionId'. Cualquier ayuda sería muy apreciada.

var parameterList = new List<AseParameter>();
parameterList.Add( new AseParameter( "@SessionId", session.SessionId ) );
parameterList.Add( new AseParameter( "@ApplicationName", session.ApplicationName ) );
parameterList.Add( new AseParameter( "@Created", session.Created ) );
parameterList.Add( new AseParameter( "@Expires", session.Expires ) );
parameterList.Add( new AseParameter( "@LockDate", session.LockDate ) );
parameterList.Add( new AseParameter( "@Locked", session.Locked ) );
parameterList.Add( new AseParameter( "@LockId", session.LockId ) );
parameterList.Add( new AseParameter( "@Timeout", session.Timeout ) );
parameterList.Add( new AseParameter( "@Flags", session.Flags ) );
parameterList.Add( new AseParameter( "@SessionItems", session.SessionItems ) );

return Connection.Execute( sqlCmd, parameterList );

Aquí hay un código de la clase base que crea la conexión.

public BaseRepository()
{
    ConnectionStringSettings css = ConfigurationManager.ConnectionStrings["AppName"];
    if (Connection == null)
        Connection = new AseConnection(css.ConnectionString);

    Connection.ConnectionString = css.ConnectionString;        
}
public void Dispose()
{
    Dispose( true );
    GC.SuppressFinalize( this );
}
protected virtual void Dispose(bool disposing)
{
    if ( !_disposed)
    {
        if ( disposing )
            _connection.Dispose();

        _disposed = true;
    }
}
public IDbConnection Connection
{
    get { return _connection; }
    set { _connection = value; }
}
public string ProviderName
{
    get { return _providerName; }
    set { _providerName = value; }
}

private string _providerName = "Sybase.Data.AseClient";
private IDbConnection _connection;
private bool _disposed = false;

esquema de base de datos

create table [AspNetSessions] 
    ([SessionId]       varchar(64) null,
     [ApplicationName] varchar(64) null,
     [Created]         datetime not null,
     [Expires]         datetime not null,
     [LockDate]        datetime not null,
     [Locked]          bit not null,
     [LockId]          int not null,
     [Timeout]         int not null,
     [Flags]           int not null,
     [SessionItems]    varchar(3800) null)

en [predeterminado]

Respuesta popular

Intenté compilaciones específicas x86 y x64 sin suerte.

Intenté volver a VS2013, no funcionó con la biblioteca de Nuget y no puede construir el código fuente.

Versión de la biblioteca Nuget de Dapper: la clase agregada CommandParameter no se llama para los parámetros cuando se agregan parámetros.

La forma en que lo hice funcionar fue descargar la fuente de Dapper de Nuget y agregar la fuente en una biblioteca separada, luego incluí la biblioteca como referencia.

En pocas palabras, Sybase y Dapper 1.42 solo funcionan en VS2015 y requieren que la fuente se incluya en el proyecto.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué