code it

Martins Tech Blog

Laufzeitfehler 3049 beim Import von Daten in Access 2003

Vor die Aufgabe gestellt, mehrere hundert csv-Dateien analysieren, hab ich mich dafür entschieden, diese in eine Access-Datenbank zu importieren. Access bietet die integrierte Funktion DoCmd.TransferText, um CSV-Daten einfach einzulesen. Also schnell einen Fünfzeiler geschrieben, der durch alle Dateien des Ordners iteriert und für jede Datei DoCmd.TransferText aufruft. 

Nach einigen Durchläufen bekam ich allerdings "Laufzeitfehler 3049" mit der vielsagenden Meldung "Datenbank '' konnte nicht geöffnet werden". Aber welche Datenbank eigentlich? Ich importiere doch aus Textdateien und wieso steht da eigentlich kein Name? Glücklicherweise bietet mir der Dialog ja die Möglichkeit, zu debuggen. Und einmal im Sourcecode konnte ich auch schnell herausfinden, welche Datei gerade importiert werden soll - vielleicht hatte ja nur der Entwickler der Funktion im Office-Team vergessen, den Dateinamen mit auszugeben. Die Datei war dann auch schnell im Dateisystem gefunden und ich öffnete sie, um sie zu prüfen. Ergebnis: Sie war nicht gesperrt und auch im richtigen Format.

Nach einiger Zeit kam ich dann auf die rettende Idee: Vielleicht handelt es sich ja wirklich um eine Datenbank und nur der Rest der Fehlermeldung ist verwirrend. Eine Prüfung der Access-Datenbank zeigte: Die Datei war mittlerweile an die Grenzen ihrer Möglichkeiten gelangt und zu einer Größe von 2 GB angewachsen. Da diese Größe bei mir hauptsächlich daraus resultierte, dass ich zuvor einen Testlauf durchgeführt hab und zwischendurch nicht komprimiert hatte, konnte ich das Problem sehr schnell lösen durch einen Aufruf von Datenbank komprimieren und reparieren. 

Problem gelöst - aber: Eine aussagekräftigere Fehlermeldung hätte mich schneller zum Erfolg gebracht....

Snippet-Wettbewerb auf dotnet-snippets.de

dotnet-snippets.de veranstaltet diesen Herbst zum mittlerweile dritten Mal einen Snippet Wettbewerb. Gesucht werden sinnvolle und wiederverwendbare Quelltextausschnitte der .NET-Sprachen C#, VB.NET, Delphi.NET, C++.NET oder ASP.NET. Dabei ist es unerheblich aus welchem Themenbereich das Snippet stammt.
Einsendeschluss ist der 13. Dezember und als Preis winken verschiedene Softwarelizenzen, Hardware und Bücher.
Nähere Informationen zu den Teilnahmebedingungen, der Jury und den Preisen gibt es auf der Seite von .NET-Snippets.

24. Treffen der PASS Regionalgruppe Sachsen am 20.11.2009

Die Ankündigung kommt dieses Mal etwas spät aber sie kommt: Morgen findet das nächste Treffen der PASS Regionalgruppe Sachsen statt. Im Anschluss an eine Einleitung zum Thema SQL Server Sizing soll ein offener Erfahrungsaustausch zum Thema Planung von Datenbanken und Datenbankservern stattfinden.
Beginn ist 17:30 Uhr im IT-Trainingshaus am Waldschlösschen. Nähere Informationen zum Termin und eine Anfahrtsbeschreibung findet man auf der PASS-Seite im Bereich Regionalgruppe Sachsen.

5. Treffen der SharePoint UserGroup Dresden

Am 17.11.2009 gab es mal wieder ein Treffen der SharePoint UserGroup. Inhaltlich stand dieses Mal SharePoint 2010 auf der Agenda. Die große Teilnehmerzahl von 25 zeigte, dass dieses Thema durchgängig auf großes Interesse stößt. In mehreren Präsentationen zeigten Sascha Henning, Torsten Hufskyund ich welche Neuigkeiten es gibt.
Da Sascha im Oktober bei der SharePoint Conference in Las Vegas und Christianim November bei der TechEd Europe in Berlin war, hatten wir auch zwei Teilnehmer dabei, die mit detaillierten Informationen dienen und Fragen beantworten konnten. Zentraler Inhalt der einführenden Vorstellung war die neue SharePoint 2010 Pie. Anhand von Beispielen erläuterte Sascha, was es genau mit den einzelnen Bereichen auf sich hat und was es zu beachten gibt. Im Anschluss daran haben wir uns die neu sortierte Zentraladministration etwas näher angeschaut und Torsten zeigte wie einfach man Administrationsaufgaben mit Hilfe der PowerShell durchführen kann. Nach einer kurzen Stärkung und der Gelegenheit, sich dabei mit anderen Teilnehmern auszutauschen, gab es noch einen kurzen Überblick über Sachverhalte, die Entwickler mit der neuen Version des SharePoint beachten sollten. Es war ein sehr informativer Abend für alle Teilnehmer.
Passend zum Thema veröffentlichte Microsoft am 18.11. die SharePoint 2010 Public Beta und damit kann nun das Gelernte direkt am System ausprobiert werden.

Das Outlook-Fenster kann nicht geöffnet werden...

Vor wenigen Tagen begrüßte mich Outlook mit der vielsagenden Meldung "Microsoft Office Outlook kann nicht gestartet werden. Das Outlook-Fenster kann nicht geöffnet werden."

Seltsam daran war, dass im Hintergrund dieser Meldung sehr wohl ein Outlook-Fenster zu sehen war, dieses aber nach einem Klick auf OK in obiger Meldung gleich wieder verschwand.

Einige Suche brachte zu Tage, dass das Profil neu erstellt werden muss oder XML-Dateien korrupt sind oder oder oder....

Aber alle diese Hinweise brachten mich zu keinem Erfolg. In einem letzten Aufbäumen der Kreativität versuchte ich dann noch die Reparatur-Kommandozeilenoptionen von Outlook selbst und siehe da - mit outlook.exe /resetnavpane hatte ich Erfolg und Outlook startet seitdem wieder normal.

Exam 70-564: Designing and Developing Applications using the Microsoft .NET Framework 3.5

Nach 3 Monaten war nun mal wieder eine Zertifizierungsprüfung dran - diesmal war es die Nummer 70-564. Das Ergebnis ist "Passed" sobald die Systeme von Microsoft aktualisiert sind darf ich mich "Microsoft Certified Professional Developer - ASP.NET Developer 3.5" nennen.

Umfang der Prüfung waren 50 Fragen aus folgenden Themengebieten:
  • Designing and Implementing Controls
  • Designing the Presentation and Layout of an Application
  • Accessing Data and Services
  • Establishing ASP.NET Solution Structure
  • Leveraging and Extending ASP.NET Architecture
  • Applying Security Principles in Application Design
Mit dabei waren Fragen, nach dem Motto "Welches Ergebnis liefert diese LINQ-Query?", "Welche DataAdapter werden wann verwendet?", "Welche datengebunden Controls haben welche spezifischen Eigenschaften?" oder "Welche Anwendungsarchitektur wählt man wenn eine Firewall mit gewissen Eigenschaften im Netz exisitiert?"

Mein Eindruck war, dass die Fragen sehr nah an die der MCTS-Prüfung 70-562 angelehnt sind und jemand der diese Prüfung bestanden hat und im täglichen Geschäft ASP.NET-Anwendungen entwickelt auch die PRO-Prüfung bestehen kann.

PowerShell: Batch-Umbennennen von Dateien

Vom Übersetzer bekam ich für ein Projekt Sprachressourcen für die Benutzeroberfläche geliefert - allerdings hatte dieser nicht nur den Inhalt geändert, sondern auch in jedem Dateinamen vor der Erweiterung das Sprachkürzel eingefügt. Um wieder die originalen Dateinamen zu erhalten - also z.B. aus Form1it.xml wieder Form1.xml - hätte ich also jeden dieser Dateinamen editieren müssen. Und genau für solche einfachen Jobs eignet sich PowerShell recht gut.

get-childitem -Path *.* | rename-item -newName {$_.name -replace "it.xml", ".xml"}

Mit einer geschickten Kombination aus get-childitem und rename-item per Pipe konnte das Problem schnell gelöst werden.

MSBuild: Wildcards im Copy-Task

Mit dem Copy-Task in MSBuild-Skripten kann man - wie der Name nicht anders vermuten ließ - Dateien von einem Ort zu einem anderen kopieren. Dabei gibt man im Attribut SourceFiles die zu kopierende(n) Datei(en) an und den Zielordner im Attribut DestinationFolder. Alternativ kann man auch das Attribut DestinationFiles verwenden und damit gleich eine Umbenennung der Datei(en) vornehmen.

<Copy SourceFiles="$(ProjectDir)\Resources\LanguageResourceCZ.xml; $(ProjectDir)\Resources\LanguageResourceDE.xml" DestinationFiles="$(LanguageResourcesPath)\CZ\LanguageResource.xml; $(LanguageResourcesPath)\DE\LanguageResource.xml" />
<Copy SourceFiles="$(ProjectDir)\Resources\LanguageResourceCZ.xml; $(ProjectDir)\Resources\LanguageResourceDE.xml" DestinationFolder="$(LanguageResourcesPath)" />

Interessant wird es dann, wenn man versucht, die Quelldateien per Wildcard auszuwählen. Der Versuch wird mit einer Fehlermeldung quittiert: 
Error MSB3021: Unable to copy file "C:\Entwicklung\Resources\*.*" to "C:\Deploy\Resources". Illegal characters in path.

Wie für alles gibt es auch hierfür eine Lösung. Man erzeugt zunächst ein Item - denn hier kann man Wildcards verwenden - und übergibt dieses dann dem Copy-Task.

<CreateItem Include="$(ProjectDir)\Resources\*.*">
    <Output TaskParameter="Include" ItemName="ResFiles" />
</CreateItem>
<Copy SourceFiles="@(ResFiles)" DestinationFolder="$(LanguageResourcesPath)" />

Damit sind Wildcards auf einer Ebene möglich. Manchmal möchte man auch rekursiv kopieren. Dazu gibt es einen guten Eintrag im MSBuild Team Blog. Zunächst werden die Dateien in einer ItemGroup zusammengefasst und dann dem Copy-Task übergeben. Dabei bestimmt der Wildcard **, dass eine rekursive Auswahl erfolgen soll. Das Metadatum %(RecursiveDir) wird dann verwendet, um die Daten auch wieder rekursiv in der korrekten Ordnerstruktur ablegen zu können.

<ItemGroup>
    <Compile Include="$(ProjectDir)\Resources\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(Compile)" DestinationFolder="$(LanguageResourcesPath)\%(RecursiveDir)" />