Bester Weg, um den IDBCommand -Parameter zu validieren
-
15-10-2019 - |
Frage
Nehmen wir an, ich habe eine Klasse
public class foo { public string FooId { get; set; } }
Jetzt in meiner Datenebene versuche ich, Code zu schreiben, die eine Instanz von idatacommand erstellen und fooid wie die Befehlsparameter so etwas festlegen
public void save(foo f, IDbConnection conn)
{
IDataCommand cmd = conn.CreateCommand();
cmd.CommandName = "SP_SAVE_INFO" ;
IDataDbParameter param = cmd.CreateParameter();
param.name = "@fooId";
param.value=(f.id>0)?f.id:(object)DbNull.Value;
cmd.parameters.add(param);
cmd.ExecuteNonQuery();
}
Wenn Sie die Codezeile bemerken - param.Value = (f.fooid> 0)? F.id: (Objekt) dbnull.Value; . Meine Frage ist genau in diesem Bereich. Wenn ich zu viele Parameter zur Verfügung habe. Es sieht irgendwie schlecht aus, wenn ich bei jedem Parameter wie diesen nach Wert suche. Frage hier ist der beste Weg, um so etwas zu tun? Wer sollte das DL oder BL machen? Wenn BL, sollte es dort den DBNull -Wert zuweisen? Gibt es eine andere Standardmethode, um dies zu tun?
Lösung
Probieren Sie eine generische Erweiterungsmethode aus?
public static class IDataDbParameterExtensions
{
public static void SetValue<T>(this IDataDbParameter parameter, T value)
{
if(value == default(T)) // for structs (ValueTypes) like Int, default(T) will be 0 and for classes (RefTypes), it will be null.
{
parameter.Value = DBNull.Value;
}
else
{
parameter.Value = value;
}
}
}
Verwenden Sie es wie folgt:
param.SetValue(f.id);
Andere Tipps
Die vollständigste Lösung ist, dies nicht selbst zu tun. Es gibt viele Frameworks, die Ihnen hier helfen. Schauen Sie sich zum Beispiel den NHiberNate- oder Entity -Framework an.
Wenn Sie dies wirklich manuell tun müssen, können Sie die Überprüfungen in wiederverwendbare Methoden umrüsten. Etwas wie das:
public void AddIntParameterWithNullForZero(IDataCommand command, string parameterName, int parameterValue)
{
// Add the parameter and perform the checks here.
}