Erste Version von jeperti.IrcLogger released!

Seit gerade eben finden Sie unter Downloads und Services die erste Version meiner Bibliothek „jeperti.IrcLogger“ die es einer .Net Anwendung in Kombination mit der Microsoft Enterprise Libarary erlaubt Logging Einträge in einen IRC Channel zu schreiben.

Erfahren Sie hier mehr darüber !

Ich freue mich über Ihr Feedback!

Veröffentlicht unter .Net | Kommentare deaktiviert für Erste Version von jeperti.IrcLogger released!

ORA-01403: No Data Found

Der Fehler ORA-01403: No Data Found (bzw: Keine Daten gefunden) tritt im PLSQL Kontext gerne bei „select into “ – Anweisungen auf.

select nachname into var_nachname where user_id = 1234;

Wird nun die Query ausgeführt und keine Zeile als Ergebnis gefunden, kann die Variable var_nachname nicht gefüllt werden und das Programm steigt an dieser Stelle aus.

Besser also den Fehler abfangen:

begin
   select nachname into var_nachname where user_id = 1234;
exception when no_data_found then:
--Fehlerbehandlungen;
end;

Der Fehler tritt aber auch in Kombination mit Varrays und Tables auf.
Hier ein Beispiel eines Arrays für Umrechnungskurse:

declare
   --Declaration des Typ eines Arrays,dass Numbers als Nutzinhalt speichert und durch Zeichen Adressiert wird
   type fxt is table of number index by varchar2(3);
   fxkurs_collection fxt;

   procedure Init
       for fxc in (select waehrung, kurs
                   from kurstabelle where datum = sysdate)
       loop
          fxkurs_collection(fxc.waehrung) := fxc.kurs;
       end loop;
   end Init;
begin
   -- Schreibt den Kurs von US-Dollar in die Konsole
   DBMS_OUTPUT.PUT_LINE(fxkurs_collection('USD')); 

   -- Liefert No_Data_Found Exception
   DBMS_OUTPUT.PUT_LINE(fxkurs_collection('XXX'));
end;

Auch hier kann man sich natürlich wieder über das „Fangen“ von Exceptions schützen. Um dies allerdings von vornherein zu verhindern, gibt es in PLSQL – genau wie in .Net – Methoden die Prüfen ob ein Schlüssel vorhanden ist:

if (fxkurs_collection.exists(waehrung)) then
   DBMS_OUTPUT.PUT_LINE(fxkurs_collection(waehrung));
else
   DBMS_OUTPUT.PUT_LINE('Kurs zu Waehrung nicht gefunden);
end if;
Veröffentlicht unter Oracle | Kommentare deaktiviert für ORA-01403: No Data Found

ORA-01858: Ein nicht-numerisches Zeichen wurde gefunden….

Heute bewege ich mich in der Programmiersprache PLSQL auf Oracle.

Der Fehler den ich heute hatte ist ganz detailliert dieser :

ORA-01858: Ein nicht numerisches Zeichen wurde gefunden, während ein numerisches Zeichen erwartet wurde

bzw:

ORA-01858: a non-numeric character found where a digit was expected

Der Code dazu war im wesentlichen, ein For-Loop über ein Select-Statement, dass selbst wiederum eine View selektiert. Hier der Code, stark vereinfach und auf das Wesentliche reduziert:

for c1 in (
      select id,
             gebdatum
             nachname,
             vorname,
             anschrift
      from personen_view1
      where datum = sysdate ....
)
loop

      if ( c1.nachname = 'Müller' ) then
          --eigentliche logik ...
      end if;
      ......
end loop;

Die Backtrace Information der Exception hat den Fehler dabei in der ersten zeile  (also for c1…) ausgemacht. Der Fehler trat nicht sofort auf, sondern erst nach ein paar Minuten nach Start der Prozedur.

Grundsätzlich bedeutet die Fehlermeldung ja, dass die Datenbank eine Zahl erwartet hat, aber Buchstaben gefunden hat. Klassischer Konvertierungsfehler so mein erster Gedanke.

Mein erster Ansatz war also die View und deren Definition zu untersuchen : Sind alle Datentypen richtig erkannt ? Ist mir in der Prozedur ein Fehler unterlaufen, sodass ich mit einem Char-Feld rechne ? Rechne ich mit Datümern ? Sind in der View alle Konvertierungen sauber ? Wird mit Null-Werten richtig umgegangen?
Die View war diesbezüglich in Ordnung. Ein einfaches Select-Statement lief sauber durch und lieferte keine Indizien.

Also musste der Fehler in der Prozedur selbst liegen. Also habe ich sukzessive den ganzen Code auskommentiert und bin bei eben obiger Vereinfachung geblieben. Der Fehler war also eingegrent und konnte schnell und einfach nachgestellt werden.

Mit folgender Abänderung lief die Prozedur fehlerfrei aber mit falschen Ergebnissen durch:

for c1 in (
      select id,
             gebdatum
             nachname,
             vorname,
             anschrift
      from personen_view1
      where datum = sysdate ....
)
loop
      -- To Char Konvertierung um Fehler einzugrenzen
      if (to_char(c1.nachname) = 'Müller' ) then
          --eigentliche logik ...
      end if;
      ......
end loop;

Die fehlerhafte Typkonvertierung musste also nach der View, aber vor diesem ersten If passieren. Ein weiteres Indiz um der Ursache näher zu kommen war den Select ohne explizite Spaltenauflistung, sondern nur mit „*“ auszuführen. Auch hier lief die Prozedur fehlerfrei.

Des Rätsels Lösung befindet sich in der Zeile mit der Spaltenauflistung für Gebdatum. Es fehlt hier ein Komma (Ende Zeile 03). Dadurch wird die darauffolgende Spalte „Name“ nicht zur Spaltenauflistung der Selects, sondern nur  zum Alias der Spalte „Gebdatum“. Der Vergleich auf den Nachnamen Müller vergleicht nun also nicht „Müller“ mit der Spalte „nachname“ der View sondern mit dem „gebdatum“, dass durch nur anders heisst. Insgesamt also ein dummer Copy & Paste Fehler der im größeren Aufbau nur schwer zu finden war.

Aber warum trat der Fehler erst nach ein paar Minuten auf ? Dieser Fehler hätte sofort und beim ersten Datensatz auffallen müssen. Mit Blick auf den Explain Plan des SQL-Statements bzw. der View wird klar, dass das Ergebnis über einen Hash-Join gebildet wird. Diese Form des Joins hat die Auswirkung, dass der erste Aufbau des Cursors relativ lange dauert (besagte Minuten) , beim Iterieren über die Datensätze aber dafür schneller Daten liefern als mit Nested-Loops. Der Fehler ist also wirklich auch schon beim ersten Fehler aufgetaucht, weil es eben Minuten dauerte um den ersten Satz zu liefern.

Veröffentlicht unter Datenbanken | Kommentare deaktiviert für ORA-01858: Ein nicht-numerisches Zeichen wurde gefunden….

Sortieren in Linq

Angenommen man möchte eine Liste von Personen sortieren. Die Klasse sieht in etwa wie diese aus:

public class Person
{
public int ID { get; set; }
public string Vorname { get; set; }
public string Nachname { get; set; }
}

Das Sortieren nach Nachnamen ist noch einfach:


List<Person> personen = new List<Person>();
//.......Laden der Liste

personen.OrderBy(p => p.Nachname);

Aber was, wenn zwei Personen den gleichen Nachnamen haben?

personen.OrderBy(p => p.Nachname).OrderBy(p => p.Vorname);

Das ist nicht die Lösung. Die Liste wird nun nur noch nach Vorname sortiert.

Die Lösung ist die Extension „ThenBy“, damit wird nun innerhalb eines Nachnamens nach Vornamen sortiert – wie gewünscht!

personen.OrderBy(p => p.Nachname).ThenBy(p => p.Vorname);

Ich persöhnlich sortiere zum Schluss gerne noch nach etwas syntetischem – beispielsweise der ID.
Das hat den Vorteil, dass selbst im unmöglichsten Fall (in diesem Beispiel, dass zwei den gleichen Vor- und Nachnamen haben) immer eine definierte Reihenfolge festgelegt ist. Selbst in diesem Fall, erhält der User in der Oberfläche immer eine definierte Reihenfolge. Gerade bei PLinq kann man sich ja auf die Reihenfolge gar nicht mehr verlassen..

personen.OrderBy(p => p.Nachname).ThenBy(p => p.Vorname).ThenBy(p=>p.ID);
Veröffentlicht unter .Net | Kommentare deaktiviert für Sortieren in Linq

Cache Api Fehlermeldung: Cache ist nicht verfügbar

Heute habe ich mich mit der CacheApi in ASP.Net beschäftigt.

Diese bietet in ASP.Net Seiten ähnlich dem Application oder Session Object die Möglichkeit Werte/Objekte zu speichern, ist hier aber intelligenter und verwirft die Objekte nach einer festgelegten Zeitdauer. Die Intellisense Hilfe zu den Methoden ist selbsterklärend: Ablauf nach einer Zeitspanne, nach einem absolutem Datum …

Selbsterklärend ? Dachte ich…  Bei der Verwendung erhielt ich beim ersten Zugriff auf Cache aus einer aspx-CodeBehind-Klasse heraus eine HTTPException mit der Meldung „Cache is not available“ bzw „Cache ist nicht verfügbar“.  Lange habe ich nach der Lösung gesucht; vielleicht muss man den Cache ja irgendwo (web.config, Page Directive etc) aktivieren?! Aber nichts. Auch Google stellt sich dumm.

Letztenendes ist die Lösung einfach statt nur „Cache.Get(…“  „HttpContext.Current.Cache…“ zu verwenden. Leider habe ich keine Erklärung parat woran es liegt ?!

Veröffentlicht unter .Net | Kommentare deaktiviert für Cache Api Fehlermeldung: Cache ist nicht verfügbar

Performanceoptimierung oder was .Net wirklich macht

Es kursiert immer wieder das Gerücht, dass bestimmte Anweisungen im Code „schneller“ und besser sind als andere. Gerade Entwickler die in älteren Sprachen angefangen haben, trauen den „neuen“ Sprachen nicht über den Weg.

Auf der Suche nach Erklärungen habe ich mich nun selber auch mal mit der Performance von alltäglichen Code beschäftigt. Wie wäre es z.B. mit String Operationen ? Da gibt es doch immer das Gerücht, das die Verbindung von Strings über „+“ viel zu langsam ist. Damit fange ich doch gleich mal an…. Weiterlesen

Veröffentlicht unter .Net, Programmierung | Kommentare deaktiviert für Performanceoptimierung oder was .Net wirklich macht

Die mysteriösen Fehlermeldungen des SQL Servers…

Heute hatte ich einen interessante Fehlermeldung vom MS SQL Server 2008 bei einem SQL erhalten:

The multi-part identifier „[Tabelle.Spalte]“ could not be bound.

Mit der Meldung hatte ich erst nicht viel anfangen können und habe mich also bei Google auf die Suche gemacht was das wohl ist. Gefunden habe ich dabei einen Artikel über den im SQL Server 2005 neuen Befehl „Apply“: Cross Apply auf MSSQLTipps

Das war zwar ein interessanter Exkurs über einen -für mich neuen- Operator, aber wohl nicht die Lösung meines Problems. Aber, meine Fehlermeldung taucht in dem Artikel auf, und hier dreht es sich wohl um die Definition des Joins.

Also nochmal zu meinem SQL , auf das nötigste reduziert :

select *
from tabelle1 tab1
join tabelle2 tab2 on tab1.fid = .tab2.fid
where tab1.name like 'a%' .....

Das Problem liegt hier in der Definition des Joins, hier hat einfach der Alias bzw der Spaltenname (in meinem Beispiel „.tab2.fid“ => „tab2.fid“).

Vielleicht findet ja nun der nächste mit dieser Fehlermeldung seine Lösung schneller als ich…

Veröffentlicht unter Datenbanken, SQL | Kommentare deaktiviert für Die mysteriösen Fehlermeldungen des SQL Servers…

Meine erste Coding Dojo- Erfahrung

Ein Coding Dojo ist eine Veranstaltung bei der sich viele motivierte Entwickler treffen um eine gestellte Aufgabe zu lösen. Die gestellte Aufgabe wird dann meistens in Gruppenarbeit gelöst und die Ergebnisse der Menge präsentiert. Die Aufgabe ist bewusst nicht scharf umrissen und auch nicht besonders anspruchsvoll. Ziel ist es dann aber diese Aufgabe so gut wie möglich zu lösen und dabei über die Entwicklung zu reflektieren.

Am Montag war es dann soweit,mein erstes Coding-Dojo.

Ausgerichtet wurde es von der .Net Coding Dojo Gruppe.
Stattgefunden hat es bei Microsoft in Unterschleißheim bei München.
Die Aufgabe war einen Paginator zu bauen, also eine Klasse die die Seitenfunktionalität von Listen im Web abbildet.

Aufgeteilt in mehrere kleine Gruppen, war die Aufgabe mit Extreme Programming und TDD zu lösen.
Schon nach kurzer Zeit war die Diskussion groß, weil jeder für diese Aufgabe eine andere Lösung dazu im Kopf hatte oder gar die Aufgabe unterschiedlich verstanden hatte

Sehr interessant war dann auch, was dann nach ca. 3 Stunden bei den verschiedenen Gruppen herausgekommen ist, auch wenn längst nicht alle Gruppen die Anforderungen erfüllt haben.
Mein Lernerfolg fürs nächste mal: Ist die Aufgabe auch noch so einfach, Finger weg von der Tastatur und erst mal das Ziel definieren.

Prädikat: Empfehlenswert!

Veröffentlicht unter Programmierung | Kommentare deaktiviert für Meine erste Coding Dojo- Erfahrung

Clean Code Development

Heute möchte ich ein paar Wörter über die Methoden der Softwareentwicklung verlieren.
Und zwar geht es mir hier um die Clean Code Initiative von Ralf Westphal & Stefan Lieser.

Es geht dabei nicht um konkreten Code, bestimmte Frameworks oder andere Technologien. Es geht dabei um sekundäre Entwicklungsziele, die meistens in keinem Pflichtenheft stehen, sondern als selbstverständlich angenommen werden: guten, verständlichen Code, Wartbarkeit, Stabilität …

Das alles wird durch die persöhnliche Entwicklung des Code-Schreiberlings erreicht. Der Entwickler soll über seinen eigenen Code reflektieren und dadurch besser werden.

Die behandelten Regeln sind einfach, vieles auch schon oft gesagt/gelernt („DRY“– und „KISS“– Prinzip) und sollte eigentlich selbstverständlich sein.
Ein Blick darauf wird also keinem Schaden 😉

Veröffentlicht unter Programmierung | Kommentare deaktiviert für Clean Code Development

Netzlaufwerke per Script mappen – Wie man es nicht macht

Heute wollte ich ein Netzlaufwerk per script mappen. Soweit so einfach.
Der entsprechende Befehl ist „netuse“ und die Hilfe dazu liefert wie man ihn benutzt.

net use l: \\rechner\freigabe\ordner\

Leider funktioniert das so nicht. Es folgt ein „Systemfehler 53“.
Schuld ist der letzte „\“. Sobald man ihn weglässt funktionierts es wie gewollt.

Veröffentlicht unter Windows | Kommentare deaktiviert für Netzlaufwerke per Script mappen – Wie man es nicht macht