离开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]
答案 0 :(得分:0)
我尝试了特定的x86和x64版本而没有运气。
我尝试回到VS2013,它没有使用Nuget库,也无法构建源代码。
Nuper库版本的Dapper:添加参数时,没有为参数调用添加的CommandParameter类。
我使用它的方法是从Nuget下载Dapper源并将源添加到一个单独的库中,然后将库作为参考包含在内。
简而言之,Sybase和Dapper 1.42仅适用于VS2015,并且需要将源包含在项目中。