【发布时间】:2016-04-21 14:31:14
【问题描述】:
退出 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)
开启 [默认]
【问题讨论】:
-
你能展示你插入数据的整个方法吗?
-
你能显示表格的架构吗?
-
当您说数据库中的所有字符串字段都设置为空时,我假设您仅指
SessionId、ApplicationName和SessionItems列其他人有正确的数据。是这个意思吗? -
是的,其他所有内容都已正确插入。只有 3 个 varchars 字段设置为 null。
-
上面显示的 Insert 方法是将字符串设置为 null 的原始代码,其他代码位是我尝试过的,但不起作用。您想查看用于创建连接的其他方法吗?
标签: c# asp.net database sybase dapper