Laden...

DBNull bei Instanzierung eines Typ's abfangen

Letzter Beitrag vor 17 Tagen 4 Posts 182 Views
DBNull bei Instanzierung eines Typ's abfangen

Hallo!

Ich möchte DBNull-Werte einer Spalte einer DataTable bei der Instanzierung eines Typ's abfangen.

Ich habe eine DataTable: TabBatchImportDefinitionen, dessen Zeilen ich über eine Linq-Abfrage iteriere und dabei neue Instanzen des Typs: BatchImportDefinition erstelle um eine "Liste" (IEnumerable<T>) der Werte der DataTable zu erstellen:

IEnumerable<BatchImportDefinition> ietab =
    TabBatchImportDefinitionen.AsEnumerable().Select(row =>
    {
        return new BatchImportDefinition
        {
            Bezeichnung = (string)row["BEZEICHNUNG"],
            Dokumententyp = (string)row["DOK_TYP"],
            ENCODING_TEXT = (if (Convert.IsDBNull(row["ENCODING_TEXT"])) 0           // DB-NULL Werte abfangen
                                else Convert.ToInt32(row["ENCODING_TEXT"], App.GebietsSchema))
        };
    });

Da eine Spalte (ENCODING_TEXT) auch DBNull-Werte enthalten kann, möchte ich sie bei der Instanzierung des Typ's (BatchImportDefinition) abfangen.

Eine if-Abfrage innerhalb der Instanzierung ist aber nicht gültig.

Welche Möglichkeit gibt es denn dies zu realisieren?

Du befindest Dich in seinem Delegate Scope. Schreibs also in die Expression.

   TabBatchImportDefinitionen.AsEnumerable().Select(row =>
    {
        var abcValue = isnullAbfrageHier ? abc : xyz;
        return new BatchImportDefinition
        {
            Bezeichnung = (string)row["BEZEICHNUNG"],
            Dokumententyp = (string)row["DOK_TYP"],
            ENCODING_TEXT = abcValue
        };
    });

Hier im Editor geschrieben, daher stark vereinfacht.

Wenn das als Expression kompiliert werden sollte, musst Du ne Expression Func draus machen.

Hallo Abt!

Ich liebe deine fachgerechten Antworten!!!

Natürlich hat es so funktioniert!

TabBatchImportDefinitionen.AsEnumerable().Select(row =>
{
     int eNCODING_TEXT = Convert.IsDBNull(row["ENCODING_TEXT"]) ? 0 : Convert.ToInt32(row["ENCODING_TEXT"], App.GebietsSchema);  // DB-NULL Werte abfangen

     return new BatchImportDefinition
     {
          Bezeichnung = (string)row["BEZEICHNUNG"],
          ...
          ENCODING_TEXT = eNCODING_TEXT
      };
});

Ich war zu sehr darauf fixiert, die DBNull-Abfrage bei der Initalisierung zu implementieren. Das row-Objekt habe ich ja schon vorher!!!

Vielen DANK! für deine schnelle Hilfe!

Den trinären Operator ?: kann man auch direkt bei der Zuweisung benutzen:

TabBatchImportDefinitionen.AsEnumerable().Select(row =>
{
     return new BatchImportDefinition
     {
          Bezeichnung = (string)row["BEZEICHNUNG"],
          ...
          ENCODING_TEXT = Convert.IsDBNull(row["ENCODING_TEXT"]) ? 0 : Convert.ToInt32(row["ENCODING_TEXT"], App.GebietsSchema) // DB-NULL Werte abfangen
      };
});

Persönlich hätte ich dann nur row["ENCODING_TEXT"]als Variable benutzt, damit es nur einmalig berechnet wird:

TabBatchImportDefinitionen.AsEnumerable().Select(row =>
{
     var encodingText = row["ENCODING_TEXT"];
     return new BatchImportDefinition
     {
          Bezeichnung = (string)row["BEZEICHNUNG"],
          ...
          ENCODING_TEXT = Convert.IsDBNull(encodingText) ? 0 : Convert.ToInt32(encodingText, App.GebietsSchema) // DB-NULL Werte abfangen
      };
});

Eigenartig finde ich nur, daß die Encoding-Spalte als Text (string) in der DataTable definiert ist (wenn du diese dann doch als Zahl interpretierst). Oder können dort auch Encodings wie  UTF8, UTF16stehen? Dann würdest du aber eine Exception erhalten...
Und auch die Angabe eines lokalisierten IFormatProviders bei so einer Spalte ist sehr eigenartig. Wäre CultureInfo.InvariantCulture dort nicht sinnvoller?