2016-08-24 4 views
0

Ich erstelle eine Seite, die den neuesten Datensatz einer Audit-Tabelle in unserer Datenbank anzeigen wird, die ich mit der folgenden Abfrage abrufen kann.Füllen C# Klasse von einfachen SQL-Abfrage

select top 1 StartDateTime, EndDateTime, Status 
from Audit 
order by StartDateTime desc 

Da diese Informationen werden mehrmals während meiner gesamten Anwendung verwendet werden, wollte ich eine Klasse erstellen, die in der Zeile lesen würden und füllen Sie ein „Statistik“ Objekt, das ich von jeder Seite nennen könnte.

Meine Klasse derzeit sieht aus wie

public class Stats 
{ 
    public DateTime startDate() { 

     string mySQL; 
     mySQL = "select top 1 StartDateTime from Audit order by StartDateTime desc"; 

     string myConnectionString; 
     myConnectionString = "databaseCS"; 

     SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings[myConnectionString].ConnectionString); 

     SqlCommand myCommand = new SqlCommand(mySQL, myConnection); 

     using (myConnection) 
     { 
      myConnection.Open(); 
      DateTime startDate = Convert.ToDateTime(myCommand.ExecuteScalar()); 
      return startDate; 
     } 

    } 
    public DateTime endDate() 
    { 
     string mySQL; 
     mySQL = "select top 1 EndDateTime from Audit order by StartDateTime desc"; 

     string myConnectionString; 
     myConnectionString = "databaseCS"; 

     SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings[myConnectionString].ConnectionString); 

     SqlCommand myCommand = new SqlCommand(mySQL, myConnection); 

     using (myConnection) 
     { 
      myConnection.Open(); 
      DateTime endDate = Convert.ToDateTime(myCommand.ExecuteScalar()); 
      return endDate; 
     } 
    } 

    public string status() { 

     string mySQL; 
     mySQL = "select top 1 EndDateTime from Audit order by StartDateTime desc"; 

     string myConnectionString; 
     myConnectionString = "databaseCS"; 

     SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings[myConnectionString].ConnectionString); 

     SqlCommand myCommand = new SqlCommand(mySQL, myConnection); 

     using (myConnection) 
     { 
      myConnection.Open(); 
      string status = Convert.ToString(myCommand.ExecuteScalar()); 
      return status; 
     } 


    } 

Die Seiten, die die Daten zeigen werden wird öfter als nicht mindestens zwei dieser Statistiken daher mehrere Datenbankabfragen, die ich will werden die Anzeige zu vermeiden.

Gibt es eine Möglichkeit, meinen Code zu ändern, um die Datenbank einmal abzufragen?

Vielen Dank

+0

Wie werden Sie die Datenbank abfragen? Sie müssen etwas zeigen oder wir raten. – DavidG

+0

Entschuldigung, nur Bearbeitung jetzt –

+0

'" würde erfordern, dass die Datenbank mehrmals abgefragt wird "' - Warum? Sie haben eine Datenbankabfrage in Ihrer Frage, die die gewünschten Daten zurückgibt, nicht wahr? Führen Sie diese Abfrage einmal aus und Sie haben die gewünschten Daten. Was genau ist das Problem hier? Fragen Sie nur, wie Sie eine Datenbank in C# verwenden? – David

Antwort

-1

Im Application_Start() des Global.asax einen Anruf von der Abfrage für die Datentabelle oder Datenmenge machen, dann speichern Sie es auf Sitzung

 protected void Application_Start() 
     { 
     string query = "your query"; 
     ///Typically you would have some sort of datalayer 
     SqlConnection sqlConn = new SqlConnection(conSTR); 
     sqlConn.Open(); 
     SqlCommand cmd = new SqlCommand(query, sqlConn); 

     DataTable dt = new DataTable(); 
     dt.Load(cmd.ExecuteReader()); 
     sqlConn.Close(); 

     ///Create Stat object 
     Stats stat = new Stats(); 
     stat.startDate = dt.Columns["startDate"]; 
     //etc 
     Session["stats"] = stat; 
} 

dann auf der Seite

protected void Page_Load(object sender, EventArgs e) 
    { 
    Stats stat = Session["stats"] as Stats; 
     } 
-1

Ein robusteres Beispiel

public class MvcApplication : System.Web.HttpApplication 
    { 
     //Internal reference to the cache wrapper object 
     private static ICacheService _internalCacheObject; 

     //Public mehtod used to inject a new caching service into the application. 
     // This method is required to ensure full testability. 
     public void RegisterCacheService(ICacheService cacheService) 
     { 
      _internalCacheObject = cacheService; 
     } 

     //Use this property to access the underlying cache object from within 
     // controller methods. Use this instead of native Cache object. 
     public static ICacheService CacheService 
     { 
      get { return _internalCacheObject; } 
     } 
     protected void Application_Start() 
     { 
      //Inject a global caching service 
      RegisterCacheService(new AspNetCacheService()); 
      //Store some sample app-wide data 
      CacheService["StartTime"] = DateTime.Now; 
      //Call the cache service 
      // var data = MyNameSpace.MvcApplication.CacheService[...]; 
     } 

    } 

Schnittstelle

public interface ICacheService 
    { 
     Object Get(String key); 
     void Set(String key, Object data); 
     Object this[String key] { get; set; } 
    } 

Klasse

public class AspNetCacheService : ICacheService 
    { 
     private readonly Cache _aspnetCache; 
     public AspNetCacheService() 
     { 
      if (HttpContext.Current != null) 
      { 
       _aspnetCache = HttpContext.Current.Cache; 
      } 
     } 
     public Object Get(String key) 
     { 
      return _aspnetCache[key]; 
     } 
     public void Set(String key, Object data) 
     { 
      _aspnetCache[key] = data; 
     } 
     public object this[String name] 
     { 
      get { return _aspnetCache[name]; } 
      set { _aspnetCache[name] = value; } 
     } 

    }