Frage

SQLServer int Feld. Wert manchmal null. Dataadapter füllt Dataset OK und kann Daten in Datagridview OK angezeigt werden soll.

Beim Versuch, die Daten programmatisch aus dem Datensatz der Datensatz Feld Abrufcode wirft einen StronglyTypedException Fehler abzurufen.

 [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public int curr_reading {
        get {
            try {
                return ((int)(this[this.tableHistory.curr_readingColumn]));
            }
            catch (global::System.InvalidCastException e) {
                throw new global::System.Data.StrongTypingException("The value for column \'curr_reading\' in table \'History\' is DBNull.", e);
            }

diese Vergangenheit kann für DBNull in der get-Zugriffsprüfung und die Rückkehr null, aber ... Wenn die Datensatzstruktur geändert wird (noch in der Entwicklung) meine Änderungen (wenig überraschend) verschwunden sind.

Was ist der beste Weg, um diese Situation zu bewältigen? Es scheint, ich bin stecken mit damit auf Datensatzebene zu tun. Gibt es irgendeine Art von Attribut, das den automatischen Codegenerator kann sagen, die Änderungen an ihrem Platz zu bleiben?

War es hilfreich?

Lösung

Der Datensatz wird eine Boolesche Eigenschaft hat, um anzuzeigen, null.

int curr_reading = ( Iscurr_readingColumnNull) ? 
                   <default_value> : row.curr_readingColumn;

Andere Tipps

In den typisierten Dataset-Designern gibt es die nullvalue Eigenschaft. In der Standardeinstellung ist sein Wert throw exception (daher Ihr generierten Code) Sie können es auf die gewünschte default value gesetzt .. dh. 0. Dann wird es 0 statt einer Ausnahme zurück. (Anderer Code erzeugt wird)

VS2008:. Das funktioniert direkt im Daten-Set-Designer

VS2005: Es funktioniert nur für Strings im Designer, aber Sie können die XSD einem SET-die Eigenschaft msprop direkt bearbeiten: Nullvalue = "0"

  1. Lassen Sie den automatisch generierten Code allein. Es gibt keine Möglichkeit zu „Intercept“ es so alle Änderungen erzeugt bekommen Sie garantiert machen zu früher weggeweht oder später.

  2. .NET (und zumindest die .NET 2.0 system.data Bits) konvertiert nicht von DBNull in irgendetwas anderes. Dieses saugt aber man kann nichts dagegen tun.

  3. Schreiben Sie eine Erweiterungsmethode ToNullable () oder ähnlich genannt: es kann dies tun:

.

public static Nullable<T> ToNullable(this object x){
    if(x == DBNull.Value)
       return default(T); // return null thing
    else
       return (T)x;
}

dann können Sie tun,

int? thing = DataRow["column"].ToNullable<int>();

Wenn der Speicher dient, müssen Sie die Zeile markieren, wie in Bearbeitung - mit .BeginEdit () oder ähnlich - dann Änderungen vornehmen und die Zeile speichern, wahrscheinlich .EndEdit () oder ähnliches verwendet wird. Sie können ein wenig zu lesen in diese Methoden tun wollen (sie auf dem DataSet sein können, oder Datatable DataRow.) - mein Gedächtnis ist ein wenig verschwommen

Hope, das hilft zumindest ein wenig.

if(row["curr_reading"] is DBNull){

}else{
    row.curr_reading;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top