Dapper 1.42和Sybase.AdoNet45.AseClient不插入字符串变量

时间:2016-04-21 14:31:15

标签: c# asp.net database sybase dapper

离开Sybase不是一种选择,并且要求在多个.NET Web应用程序之间共享会话状态。我的任务是创建一个可以与Sybase一起使用的SessionStateStoreProvider。

我们使用的是Sybase ASE 15.0,ASP.NET 4.61,它是一个mvc Web应用程序。我已经创建了一个模型库和一个用于访问数据库的存储库。存储库包含用于访问数据库的常用方法等的基类。使用Dapper 1.42和Sybase.AdoNet45.AseClient。

这是表示会话状态字段的数据库表的模型类。我已经更改了表,所以标记为varchar和varbinary的所有列都将允许空数据。

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

这是我为执行数据库操作而需要编写的代码。在这种情况下,我正在尝试插入。 Insert命令看起来像是有效的,并返回一个数据记录已添加到数据库中,但是当我检查数据库时,表中插入了一个记录,但数据库中的所有字符串字段都设置为null。

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

我也尝试使用新的{...}传递参数,结果相同。

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

我已经尝试了以下代码(我也试过在name参数前没有@符号)。我得到了例外

  

Sybase.Data.AseClient.AseException:必须声明变量'@SessionId'。任何帮助将不胜感激。

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

这是来自创建连接的基类的代码。

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;

数据库架构

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)

on [default]

1 个答案:

答案 0 :(得分:0)

我尝试了特定的x86和x64版本而没有运气。

我尝试回到VS2013,它没有使用Nuget库,也无法构建源代码。

Nuper库版本的Dapper:添加参数时,没有为参数调用添加的CommandParameter类。

我使用它的方法是从Nuget下载Dapper源并将源添加到一个单独的库中,然后将库作为参考包含在内。

简而言之,Sybase和Dapper 1.42仅适用于VS2015,并且需要将源包含在项目中。