2016-04-21 10 views
0

Das Verschieben von Sybase ist keine Option, und es ist erforderlich, den Sitzungsstatus zwischen mehreren .NET-Webanwendungen zu teilen. Ich wurde beauftragt, einen SessionStateStoreProvider zu erstellen, der mit Sybase funktioniert.Dapper 1.42 und Sybase.AdoNet45.AseClient fügt keine String-Variablen ein

Wir verwenden Sybase ASE 15.0, ASP.NET 4.61, es ist eine mvc-Webanwendung. Ich habe eine Modellbibliothek und eine Repository-Bibliothek für den Zugriff auf die Datenbank erstellt. Die Repository-Bibliothek enthält eine Basisklasse für allgemeine Methoden usw. für den Zugriff auf die Datenbank. Verwenden von Dapper 1.42 und Sybase.AdoNet45.AseClient.

Dies ist die Modellklasse, die die Datenbanktabelle für Sitzungsstatusfelder darstellt. Ich habe die Tabelle so geändert, dass alle Spalten, die als varchar und varbinary markiert sind, Nulldaten zulassen.

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

Dies ist der Code, den ich für eine Datenbankoperation schreiben muss. In diesem Fall versuche ich einen Einsatz. Der Befehl Einfügen sieht so aus, als ob er funktioniert, und gibt einen Datensatz zurück, der der Datenbank hinzugefügt wurde. Wenn ich jedoch die Datenbank untersuche, wird in der Tabelle ein Datensatz eingefügt, aber alle Zeichenfolgenfelder in der Datenbank werden auf null gesetzt.

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

Ich habe auch versucht, die Parameter mit dem neuen {...} zu übergeben, mit den gleichen Ergebnissen.

Ich habe den folgenden Code ausprobiert (ich habe es auch ohne das @ -Symbol vor dem Namensparameter versucht). Ich bekomme die Ausnahme

Sybase.Data.AseClient.AseException: muss die Variable '@SessionId' deklarieren. Jede Hilfe würde sehr geschätzt werden.

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

Hier Code von der Basisklasse, die die Verbindung schafft.

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; 

Datenbankschema

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) 

auf [Standard]

+0

Können Sie die gesamte Methode zeigen, wo Sie die Daten einfügen? – user1666620

+0

Können Sie das Schema für die Tabelle anzeigen? – juharr

+0

Wenn Sie sagen, dass _alle Stringfelder in der Datenbank auf null gesetzt sind, nehme ich an, dass Sie nur die Spalten 'SessionId',' ApplicationName' und 'SessionItems' meinen und die anderen die korrekten Daten haben.Meinst Du das? – juharr

Antwort

0

Ich habe versucht, spezifische x86 und x64 baut ohne Glück.

Ich habe versucht, zu VS2013 zurückzugehen, es funktionierte nicht mit der Nuget-Bibliothek und es kann den Quellcode nicht erstellen.

Version der Nuget-Bibliothek von Dapper: Die hinzugefügte CommandParameter-Klasse wird beim Hinzufügen von Parametern nicht für die Parameter aufgerufen.

Die Art, wie ich es funktionierte, war das Herunterladen von Dapper-Quelle von Nuget und fügte die Quelle in eine separate Bibliothek, dann die Bibliothek als Referenz enthalten.

Kurz gesagt funktioniert Sybase und Dapper 1.42 nur in VS2015 und erfordert die Einbindung der Quelle in das Projekt.