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?

War es hilfreich?

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.
  } 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top