Wie Sie einen parameter übergeben, für ein Klasse-set-Eigenschaft (und nicht Klasse Erklärung)

Hintergrund:

Ich versuche ein c# 4.0 Klasse für re-verwenden, so kann ich senden eines Parameters zu den meisten Methoden, die von meinem Programm und übergeben Sie ein "Verbindungen" Objekt, das Dinge wie:

  • ConnectionStrings
  • DbConnection (z.B. OleDbConnection oder SQLConnection)
  • DataReader (z.B. OleDbDataReader oder SQLDataReader)

Die Argumentation ist, dass ich irgendwann ein upgrade auf SQL Server und will nicht zu ändern, meine Methode Parameter oder code so viel. Methoden haben oft zu nennen, eine kurze Anfrage hier und da aus der gleichen Datenbank.

Frage:

Wie kann ich richtig-setup (und nennen) die Rechte Seite der DRMDbConnection 'set' der parameter für DbType (jetzt hard-codiert als integer-1) in der folgenden Methode in Zeile:

set { drmDbConnection = SetDRMDbConnection(1); }

Beispielcode:

public class Connections
{

public string DRMDbConnectionString { get; set; }
private object drmDbConnection;

public object DRMDbConnection
{
  get { return drmDbConnection; }
  set { drmDbConnection = SetDRMDbConnection(1); }
}

private object SetDRMDbConnection(int DbType)
{
  if (DbType == 1)
    return new System.Data.OleDb.OleDbConnection();
  else
    return new SqlConnection();
}

}

BEARBEITET Okt 31

Ich aktualisiert die Klasse code verwenden, die die empfohlene IDbConnection, IDbCommand-und IDataReader. Hinweis: ohne eine änderung an der SQL Server-Verbindungszeichenfolge, die Sie erhalten eine Fehlermeldung: "Es ist bereits ein geöffneter DataReader zugeordnet diesen Befehl, der zuerst geschlossen werden." So fügen Sie diese Verbindungszeichenfolge: "MultipleActiveResultSets=True;"

Aktualisiert Klasse code

public class Connections
//reusuable object to hold all database Connections and a convenient DataReader and Command object.
//Its purpose is to also be able to handle your choice of database connection, i.e. OleDb or SQL Server.
{
public string DRMConnectionString { get; set; }
public IDbConnection DRMConnection;

public IDbCommand DRMCommand
{
  get { return DRMConnection.CreateCommand(); }
  set { }
}

public int DRMConnectionType
//must be called to setup database connection and command.  The connectionstring must be previously set.
{
  set
  {
    if (value == 1)
      DRMConnection = new System.Data.OleDb.OleDbConnection(DRMConnectionString);
    else
      DRMConnection = new SqlConnection(DRMConnectionString);
  }
}

public void CloseConnections()
{
  if (DRMCommand != null)
    DRMCommand.Dispose();

  if ((DRMConnection != null) && (DRMConnection.State != ConnectionState.Closed))
    DRMConnection.Close();
}
}

AUFRUFENDE CODE

var conn = new Connections();
conn.DRMConnectionString = "my connection string";
conn.DRMConnectionType = 2;
conn.DRMConnection.Open();
try
{
  using (var cmd = conn.DRMCommand)
  {
    cmd.CommandText = "SELECT * FROM MyTable";
    using (var rdr = cmd.ExecuteReader())
    {
      while (rdr.Read())      
      {
         CallSubMethodThatAlsoOpensDataReader(conn);  
      } 
    } 
  }
}
finally
{
  conn.CloseConnections();
} 


CallSubMethodThatAlsoOpensDataReader(Connections Conn)
{
  using (var cmd = Conn.DRMCommand)
  {
    cmd.CommandText = "SELECT * FROM MyOtherTable";
    using (var rdr = cmd.ExecuteReader())  //Error: There is already an open DataReader associated with this Command which must be closed first.
    {
       ; //do stuff
    } 
  }
}
InformationsquelleAutor user610064 | 2012-10-26
Schreibe einen Kommentar