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
}
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie damit es funktioniert wie folgt:
Ich denke, das ist die zentrale Frage, die Sie zu lösen versuchen. Statt zu Programmieren, um die gewünschte Klasse, das Programm um eine Schnittstelle. Insbesondere mit
IDbConnection
stattSqlConnection
oderOleDbConnection
lassen würde, die Sie verstecken, die genaue Art besser als Verguss in derDRMDbConnection
.CreateCommand()
rufen Sie außerhalb derDRMDbConnectionType
setter, und in der get-Methode derDRMCommand
. Dann könnte man hinzufügenusing (var cmd = conn.DRMCommand)
, öffnen Sie den Befehl, und legen Sie seine text innerhalb derusing
block. Dadurch wird Ihr code thread-safe.CloseConnections
Methode ist unnötig;DRMDataReader
ist nie vergeben, undDRMConnection
sollte privat, nicht öffentlich. Sind Sie mit dieser gleichzeitig?Open()
Anruf auf die Verbindung. Wenn Sie die Verwaltung der Verbindung den Zustand manuell, obwohl, IhreConnections
Klasse beschränkt sich im wesentlichen auf eine Fabrik Kapselung eine RDBMS-spezifische Verbindungszeichenfolge. Ich denke, das ist ein guter Ansatz, aber: ich würde meinConnections
Klasse so einfach wie möglich.IDbConnection
machen würde, eine legitime eigenständige Frage.Eigenschaft get/Set-Methoden können Parameter übernehmen. Sie implementieren müssen, um dies als Methode.