【问题标题】:Dapper 1.42 and Sybase.AdoNet45.AseClient doesn't insert string variablesDapper 1.42 和 Sybase.AdoNet45.AseClient 不插入字符串变量
【发布时间】: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)

开启 [默认]

【问题讨论】:

  • 你能展示你插入数据的整个方法吗?
  • 你能显示表格的架构吗?
  • 当您说数据库中的所有字符串字段都设置为空时,我假设您仅指SessionIdApplicationNameSessionItems 列其他人有正确的数据。是这个意思吗?
  • 是的,其他所有内容都已正确插入。只有 3 个 varchars 字段设置为 null。
  • 上面显示的 Insert 方法是将字符串设置为 null 的原始代码,其他代码位是我尝试过的,但不起作用。您想查看用于创建连接的其他方法吗?

标签: c# asp.net database sybase dapper


【解决方案1】:

我尝试了特定的 x86 和 x64 构建,但没有成功。

我尝试回到 VS2013,它无法与 Nuget 库一起使用,并且无法构建源代码。

Dapper 的 Nuget 库版本:添加参数时不会为参数调用添加的 CommandParameter 类。

我让它工作的方法是从 Nuget 下载 Dapper 源并将源添加到一个单独的库中,然后将该库作为参考。

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

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 2014-01-30
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多