Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Nullable


flyhigh83 - Mo 31.01.11 16:49
Titel: Nullable
Hallo mal wieder.

Habe hier im Forum und auch schon auf der MSDN Seite gesucht aber irgendwie kappier ich das noch nicht.

Ich habe ein Problem mit Variable welche auch den Wert "null" annehmen können, da in der Datenbank der Wert auch "null" ist. In meiner Form habe ich folgende Abfrage, und will damit eine Liste füllen. Die Liste habe ich mir angelegt, da ich alle Bilder durchgehen will, und schaue, ob sich etwas geändert hat in der DB und wenn, wird das Bild entsprechned einigen fixen vorgaben umbenannt. Mein Problem ist wenn in der Tabelle "Table1" die "steHausnr" den Wert "null" hat, erhalte ich einen Fehler, da mein Wert aus der Klasse nicht null annehmen darf. Dies hatte ich dann abgeändert. Siehe unten.


C#-Quelltext
1:
2:
3:
4:
5:
6:
var FileQuery = (from table1 in dbDataSet.table1
         select new FileAutoRenamer
      {
       StrasseHausnr = Convert.ToString(table1.steHausnr)
      });
OrdnerBilder.AddRange(FileQuery.ToList());


Meine abgeänderte Klasse

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
public class FileAutoRenamer
  {
    private string? _StrasseHausnr; // *Code Fehler 

    /// <summary>
    /// Getter Setter StrasseHausnr
    /// </summary>
    public string? StrasseHausnr
    {
      get { return this._StrasseHausnr; }
      set
      {
        if (value != null)
        {
          this._StrasseHausnr = value;
        }
        else
          this._StrasseHausnr = " ";
      }
    }
}


Den Fehler den ich jedes mal erhalten beim Kompalieren ist

Fehler 1 Der Typ "string" darf keine NULL-Werte zulassen, wenn er als T-Parameter im generischen Typ oder in der generischen Methode "System.Nullable<T>" verwendet werden soll.

Der Fehler bezieht sich auf siehe Quelltext "*Code Fehler".

Was mache ich falsch. Ich habe bisher nur structs gesehen, welche sich null setzen lasse oder auch ganznormale Variablen, was ich an der Variable in der Klasse anders?


Ralf Jansen - Mo 31.01.11 16:55

string ist bereits ein nullable Type. Ein string? macht daher wenig Sinn was dir der Compiler umgehend auch mitteilt.


flyhigh83 - Mo 31.01.11 17:06

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
string ist bereits ein nullable Type. Ein string? macht daher wenig Sinn was dir der Compiler umgehend auch mitteilt.


Ja das hatte ich auch eigentlich schon gewusst. Aber ich kapier es irgend wie nicht, denn wenn ich es ohne Nullable versuche
sagt er mir sobald er auf etwas stößt was "null" ist

Der Wert für Spalte steHausnr in Tabelle table1 ist DBNull.

Was mache ich also da falsch?


Trashkid2000 - Mo 31.01.11 17:09

Naja, DBNull und null ist nicht das selbe.
Normalerweise hast Du für Felder, die nullable sind, eine Methode, worüber Du auf DBNull abfragen kannst.
Diese müsste in Deinem Fall "IssteHausnrNull()" oder so ähnlich heißen.


flyhigh83 - Mo 31.01.11 17:37

user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
Naja, DBNull und null ist nicht das selbe.
Normalerweise hast Du für Felder, die nullable sind, eine Methode, worüber Du auf DBNull abfragen kannst.
Diese müsste in Deinem Fall "IssteHausnrNull()" oder so ähnlich heißen.


Danke,

hat mir super weitergeholfen.
Lösung:


C#-Quelltext
1:
2:
3:
4:
5:
6:
var FileQuery = (from table1 in dbDataSet.table1
         select new FileAutoRenamer
      {
       StrasseHausnr = table1 == null ? null : (table1.IssteHausnrNull() ? null : table1.steHausnr.ToString()),
      });
OrdnerBilder.AddRange(FileQuery.ToList());


Natürlich kann man jetzt die Setter und Gett ganz normal lassen.