Autor Beitrag
darkdust
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 14.12.09 13:08 
Hallo Leute,
als eingefleischter Delphi-Programmierer versuche ich mir in den letzten Wochen C# anzueignen (viele Gründe wie Ihr euch vielleicht denken könnt).

Im Moment arbeite ich an einem Programm das Einträge aus meiner Datenbank mit Hilfe der Google API auf meinen Google-Kalender übertragen soll. Das funktioniert so weit auch wunderbar, nur gibt es da eine Sache die mir noch Kopfzerbrechen bereitet:

Ich benutze folgenden Code um meine Einträge abzugleichen:

----------------
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
private void writeEntryList(ArrayList inALDataToWrite)
    {
        CalendarService service = new CalendarService("CalendarApp");
        service.setUserCredentials(fSUsername, fSPassword);
        foreach (EventEntry entry in inALDataToWrite)
        {
            Boolean lBIsInserted = false;
            foreach (EventEntry item in fALEntryListUnattended)
            {
                if (!lBIsInserted)
                {
                    try
                    {
                        if (item.EventId == entry.EventId)
                        {
                            if (entry.Updated > item.Updated)
                                entry.Update();
                        }
                    }
                    catch (NullReferenceException)
                    {
                        AtomEntry insertedEntry = service.Insert(postUri, entry);
                        lBIsInserted = true;
                    }
                }
            }

        }      
    }

--------------------
Die inALDataToWrite enthält alle schon vorhandenen Datensätze und auch die Neuen. Bei allen neuen Datensätzen habe ich keinen Zugriff auf die EventId und löse damit eine NullReferenceException aus, die ich mit catch abfange.

Moderiert von user profile iconChristian S.: Quote- durch C#-Tags ersetzt
darkdust Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 14.12.09 13:13 
Sorry, hab was abgeschnitten und ich kann nicht editieren (blöde Firewall):
Das ist natürlich ziemlich unsauber programmiert. In Delphi würde ich den Wert einfach mit assiged abfragen. Ich habe schon verschiedenste Befehle und NULL Kombinationen ausprobiert, aber es läuft immer auf die gleiche Exception...

Gibt es einen Befehl mit dem ich testen kann ob "entry.EventId" ein Wert zugewiesen ist?

Ich hoffe da kann mir Jemand von euch helfen ^^
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 14.12.09 13:27 
if (entry.EventId != null) ...

Edit: Wenn in inALDataToWrite nur EventEntry's sind wieso benutzt du nicht einfach eine List<EventEntry> anstatt ArrayList.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 14.12.09 13:40 
Ralfs Antwort ist zwar grundsätzlich korrekt, passt aber nicht immer (und ich befürchte, hier passt es nicht).

Wenn EventId eine Zahl ist, dann bekommt das entsprechende Member von entry bereits durch den Konstruktor den Wert 0, weil Strukturen immer mit 0 initialisiert werden. In einem solchen Fall musst du also gegen 0 prüfen.

Was heißt eigentlich: du hast keinen Zugriff auf die EventId? Wenn es eine Eigenschaft der Klasse ist, kannst du es doch immer lesen.

Übrigens: Code ist als solcher zu markieren, nicht als Zitat. Dazu kannst du unter "Bereiche" C# auswählen und den Plus-Button verwenden. Außerdem gehört ArrayList in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.

Gruß Jürgen
darkdust Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 14.12.09 13:57 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
und ich befürchte, hier passt es nicht


Da hast du leider Recht:
user defined image

user defined image

Die ID ist übrigens ein String.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 14.12.09 14:01 
user profile icondarkdust hat folgendes geschrieben Zum zitierten Posting springen:
Die ID ist übrigens ein String.

Das ist die wichtigste Information überhaupt! Dafür gibt es die schöne einfache Prüfung:
ausblenden C#-Quelltext
1:
if ( ! String.IsNullOrEmpty( entry.EventId ) ) { ... }					

Jürgen
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 14.12.09 14:16 
Du solltest überprüfen ob entry selbst nicht null ist.
Die Stelle die du zeigst sollte nicht knallen wenn der string in EventID null ist außer im getter von EventID passieren interne Dinge die schief gehen.
Das solltest du aber am Stack erkennen können bzw. am Source Code der API.