none
DB NULL abfangen RRS feed

  • Frage

  • Hallo,

    ich habe eine frage zu einer Datenübernahme.

    Wenn ich folgenden Code ausführe liest er aus einer DBF Datenbank die daten aus und convertiert sie mir gleich in eine Variable. Allerdings wenn in der Datenbank der Wert NULL auftritt bekomme ich einen Run-Time-Error.

    Ich habe zwar schon einen Lösungsansatz, doch würde mich interessieren ob man das nicht irgendwie vereinheitlichen kann?!

     

                            DateTime Buchungsdatum = new DateTime();
                            bool Datum = false;

                            if (!Convert.IsDBNull(DataReader["BDATUM"]))
                            {
                                Buchungsdatum = DataReader.GetDateTime(DataReader.GetOrdinal("BDATUM"));
                                Datum = true;
                            }                      

                            int Buchungszeit = Convert.ToInt32(DataReader["BZEIT"]);
                            int Belegnr = Convert.ToInt32(DataReader["BBELEGNR"]);
                            int Buchungskonto_ID = Convert.ToInt32(DataReader["BKONTO"]);
                            decimal Buchungsbetrag = Convert.ToDecimal(DataReader["BBETRAG"]);
                            decimal Buchungssteuer = Convert.ToDecimal(DataReader["BSTEUER"]);
                            string BruttoNetto = DataReader["BN"].ToString();
                            int BezugPatient_ID = Convert.ToInt32(DataReader["BEZUG"]);
                            string Buchungstext = DataReader["BTEXT"].ToString();
                            int Buchungsgruppe = Convert.ToInt32(DataReader["BGRUPPE"]);
                            bool E_Wirksam = Convert.ToBoolean(DataReader["BEWIRK"]);
                            bool U_Wirksam = Convert.ToBoolean(DataReader["BUWIRK"]);
                            bool G_Wirksam = Convert.ToBoolean(DataReader["BGWIRK"]);
                            string Buchungsart = DataReader["BART"].ToString();
                            bool Storniert = Convert.ToBoolean(DataReader["BSTORNO"]);
                            string Honorar_ID = DataReader["HONNUMMER"].ToString();

    Währe wirklich sehr dankbar wenn es hierfür eine Lösung gebe.

    Mit freundlichen Grüßen

    Christian Rois

    Montag, 29. August 2011 09:56

Antworten

  • Z.B.:
    Buchungsdatum = (DateTime)(dataReader["BDATUM"] == DBNull.Value ? null : dataReader["BDATUM"]);
    Buchungsbetrag = (decimal)(dataReader["BBETRAG"] == DBNull.Value ? null : dataReader["BBETRAG"]);
    

    Wobei ich es gleich in eine Klasse oder ein Struct einlesen würde.
    Montag, 29. August 2011 10:21
  • Hi,

    bei Stefans Vorschlag wird ein datetime ein NULL zugewiesen, das klappt nicht ;-)

    Wie wäre es zB mit :

    DateTime Buchungsdatum = new DateTime();
    
    Buchungsdatum = DataReader["BDATUM"].GetType() != typeof(DBNull) ? DataReader.GetDateTime("BDATUM") : new DateTime(1800,1,1);
    
    oder
    
    if(DataReader["BDATUM"].GetType() != typeof(DBNull))
                      Buchungsdatum = DataReader.GetDateTime("BDATUM");
    


    Montag, 29. August 2011 10:46
  • Ok, ich dachte du kannst davon die Antwort ableiten : Ich meine das so :

    Buchungskonto_ID = DataReader["BKONTO"].GetType() != typeof(DBNull) ? DataReader.GetInt32("BKONTO") : -1
    


    Montag, 29. August 2011 11:13
  • Stimmt, bei mir ist in diesem Fall der Datentyp ja auch DateTime?. Das habe ich unterschlagen: Nullable Types.
    Montag, 29. August 2011 11:13
  • Hi christian , gerne :

     

    Buchungskonto_ID = DataReader["BKONTO"].GetType() != typeof(DBNull) ? DataReader.GetInt32("BKONTO") : -1
    


     

    Die Schreibweise Bedinung ? Wenn: Dann ist die einfache Form einer IF Else Verzweigung.

    Im ersten Teil steht die Bedingung : Ist die Spalte BKONTO Ungleich ( != ) vom Typ DBNULL ?

    Wenn Ja , hole mir den Int Wert von Spalte BKONTO , WENN nicht : setzte auf -1

     


    So jetzt darfst du gerne alle Antworten die dir gehoilfen haben , als Antwort markieren ;-)

    Grüße

    Dienstag, 30. August 2011 06:56

Alle Antworten

  • Z.B.:
    Buchungsdatum = (DateTime)(dataReader["BDATUM"] == DBNull.Value ? null : dataReader["BDATUM"]);
    Buchungsbetrag = (decimal)(dataReader["BBETRAG"] == DBNull.Value ? null : dataReader["BBETRAG"]);
    

    Wobei ich es gleich in eine Klasse oder ein Struct einlesen würde.
    Montag, 29. August 2011 10:21
  • Object reference not set to an instance of an object

    kommt dann als Fehlermeldung..

     

    Tut mir leid ich bin erst seit kurzem dabei und muss mich da erst einmal durchkämpfen (:

    Montag, 29. August 2011 10:35
  • Hi,

    bei Stefans Vorschlag wird ein datetime ein NULL zugewiesen, das klappt nicht ;-)

    Wie wäre es zB mit :

    DateTime Buchungsdatum = new DateTime();
    
    Buchungsdatum = DataReader["BDATUM"].GetType() != typeof(DBNull) ? DataReader.GetDateTime("BDATUM") : new DateTime(1800,1,1);
    
    oder
    
    if(DataReader["BDATUM"].GetType() != typeof(DBNull))
                      Buchungsdatum = DataReader.GetDateTime("BDATUM");
    


    Montag, 29. August 2011 10:46
  • Um das Buchungsdatum geht es mir jetzt nicht so.. sondern darum das ich kein DBNull in eine Integer Variable Convertieren kann und wie ich das abfangen kann :/

    Montag, 29. August 2011 10:54
  •             int Buchungszeit = 0;
                bool BZeit = false;
                if (!Convert.IsDBNull(DataReader["BZEIT"]))
                {
                  Buchungszeit = DataReader.GetOrdinal("BZEIT");
                  BZeit = true;
                }
    
                int Belegnr = 0;
                bool Beleg = false;
                if (!Convert.IsDBNull(DataReader["BBELEGNR"]))
                {
                  Belegnr = DataReader.GetOrdinal("BBELEGNR");
                  Beleg = true;
                }
    
                int Buchungskonto_ID = 0;
                bool BKonto = false;
                if (!Convert.IsDBNull(DataReader["BKONTO"]))
                {
                  Buchungskonto_ID = DataReader.GetOrdinal("BKONTO");
                  BKonto = true;
                }
    
                decimal Buchungsbetrag = 0;
                bool Betrag = false;
                if (!Convert.IsDBNull(DataReader["BBETRAG"]))
                {
                  Buchungsbetrag = DataReader.GetOrdinal("BBETRAG");
                  Betrag = true;
                }
    
                decimal Buchungssteuer = 0;
                bool Steuer = false;
                if (!Convert.IsDBNull(DataReader["BSTEUER"]))
                {
                  Buchungsbetrag = DataReader.GetOrdinal("BSTEUER");
                  Betrag = true;
                }
    
                int BezugPatient_ID = 0;
                bool Pat = false;
                if (!Convert.IsDBNull(DataReader["BEZUG"]))
                {
                  Buchungskonto_ID = DataReader.GetOrdinal("BEZUG");
                  Pat = true;
                }
    
                int Buchungsgruppe = 0;
                bool Gruppe = false;
                if (!Convert.IsDBNull(DataReader["BGRUPPE"]))
                {
                  Buchungsgruppe = DataReader.GetOrdinal("BGRUPPE");
                  Gruppe = true;
                }
    
    


    so hab ich das jez einmal gelöst.. allerdings ist dies ja nicht besonders "schön" weiß einer wie das kürzer geht?

    Montag, 29. August 2011 11:12
  • Ok, ich dachte du kannst davon die Antwort ableiten : Ich meine das so :

    Buchungskonto_ID = DataReader["BKONTO"].GetType() != typeof(DBNull) ? DataReader.GetInt32("BKONTO") : -1
    


    Montag, 29. August 2011 11:13
  • Stimmt, bei mir ist in diesem Fall der Datentyp ja auch DateTime?. Das habe ich unterschlagen: Nullable Types.
    Montag, 29. August 2011 11:13
  • Hallo Christian , Wertzuweisungen mit Abfrage gehen So wie Stefan und ich geschrieben haben.

    brauchst du die boolschen Variablen alle ?

    Wo werden diese abgefragt ?

    Montag, 29. August 2011 11:23
  • Als aller erstes wollt ich mich einmal für die rasche Antwort bedanken und sagen es Funktioniert fantastisch (:

    Die boolischen Variablen sind unnötig. Ich hab es nur so gelöst sollte der Wert != DBNull sein so schreibt er es in die DB und wenn es DBNull ist dann einen bestimmten Wert..

    das kann ich ja jetzt aber auch getrost weglassen.

     

     

    Könnte mir nur vielleicht jemand sagen was genau da passiert?

    Wie gesagt ich bin erst seit ca 1 Jahr dabei und probiere echt so gut und schnell wie möglich was zu lernen.

    Vielen Dank trotzdem noch einmal!!!!!

    Dienstag, 30. August 2011 06:49
  • Hi christian , gerne :

     

    Buchungskonto_ID = DataReader["BKONTO"].GetType() != typeof(DBNull) ? DataReader.GetInt32("BKONTO") : -1
    


     

    Die Schreibweise Bedinung ? Wenn: Dann ist die einfache Form einer IF Else Verzweigung.

    Im ersten Teil steht die Bedingung : Ist die Spalte BKONTO Ungleich ( != ) vom Typ DBNULL ?

    Wenn Ja , hole mir den Int Wert von Spalte BKONTO , WENN nicht : setzte auf -1

     


    So jetzt darfst du gerne alle Antworten die dir gehoilfen haben , als Antwort markieren ;-)

    Grüße

    Dienstag, 30. August 2011 06:56
  • aaaaaah grenzgenial und einfach :D

    danke viel mals!!

    Dienstag, 30. August 2011 07:22