Beiträge in Kategorie: .NET


Mit Hilfe von Virtual Earth habe ich eine thematische Karte auf Landkreisebene gezeichnet. Dabei stieß ich auf das Problem das die Grenzen nicht sauber gezeichnet wurden. Da die Landkreise, die ich darstellen wollte benachbart waren kam es zu Löchern und Überlappungen auf der Karte, wie es im ersten Bild zu sehen ist. Im 3D Mode gab es dieses Problem nicht

ohneOptimierung

Ich hatte überlegt ob das vielleicht an der Projektion liegt und somit an meinen Geodaten. Aber eigentlich konnte das nicht sein und deswegen habe ich ein wenig in der API geschaut und folgendes Flag gefunden:

map.EnableShapeDisplayThreshold(false);

Implizit optimiert Virtual Earth also die Darstellung von Polygonen. Das ist natürlich in vielen Fällen sinnvoll, bloß bei benachbarten Polygonen nicht. Schaltet man die Optimierung aus werden die Karten wie im zweiten Bild gezeichnet. In der API kann man das auch noch mal genauer lesen.

mitOptimierung

Ich beschäftige mich seit einiger Zeit etwas intensiver mit Business Intelligence im SQL Server 2005. Um mich in das Thema einzuarbeiten habe ich mit das Buch:
Business Intelligence und Reporting mit Microsoft SQL Server 2005 von Pedro Azevedo (Autor), Gerhard Brosius (Autor), Stefan Dehnert (Autor) zugelegt. Ich möchte an dieser Stelle über meine Eindrücke zum Buch berichten.
Die Themen die in dem Buch behandelt werden sind:
• OLAP
• Analysis Services
• Data Mining
• Integration Services (SISS)
• Reporting Services
• Analysis Services-Programmierung

Ich habe mich den Abschnitten zu OLAP, Analysis Services und Analysis Services-Programmierung genauer beschäftigt. Das Buch arbeitet sehr viel mit Beispielen. Diese Beispiel basieren auf Datenbanken vom Adventure Works Cinema und von den Autoren auf ihrer Webseite zur Verfügung gestellten Datenbanken. Problematisch an diesen Autorendatenbanken ist, dass bei mir zwei nicht funktioniert haben. Ich habe versucht mit den Autoren über ihre Webseite Kontakt aufzunehmen, es kam jedoch keine Antwort, nicht einmal eine automatisierte Nachricht.
Zu den Beispielen in dem Buch ist zu sagen, dass sie alle sehr einfach gehalten sind, und sie Schritt für Schritt erklärt werden. Die erklärt auch die Dicke des Buches, denn es ist fast jedes Fenster (Form), dass während der Beispiel verwendet wird abgebildet. Und es wird genau erklärt was in welche Textbox eingeben werden muss, und was angeklickt werden muss, damit das Beispiel läuft. Es muss also sehr genau lesen damit man die Beispiele zum Laufen bekommt. Bei diesen Beispielen wird nicht nach rechts oder links geschaut, was das Verständnis für mich stark erschwert hat.
Meiner Meinung nach hätten es weniger Beispiele auch getan, dafür hätte man mehr erläutern und Konzepte ermitteln können. Schließlich erscheint das Buch auch in der Reihe Fachbibliothek und nicht in der Schritt für Schritt- Reihe. Etwas, was mich besonders aufgeregt hat waren die Erläuterungen zu XMLA. Mit XMLA kann man multidimensionale Daten über das “Web” abfragen. Es gibt verschiedene Formen von XMLA die sich je nach Art der Daten besser für eine Abfrage geeignet sind. Im Buch wurde ein Skript zur Verfügung gestellt, welches die SOAP-Aufrufe kapselt und die Ergebnisse in einer HTML Tabelle anzeigte. Es wurde nicht erläutert, wie der Service an sich funktionierte, dass man nämlich reine SOAP-Anfragen an die DLL schicken muss, geschweige denn wurde etwas zu Sicherheitseinstellungen erläutert. Am ärgerlichsten für mich war, dass die Autoren nicht erläutert hatten welches Formate es bei XMLA gibt, und selber nur die Tabellen-Darstellung verwendet hatten, die für die Darstellung von n-Dimensionen nur sehr schlecht verwendbar ist, ich würde sogar glatt behaupten es ist unmöglich. Und ja nur multidimensionale Abfragen Sinn machen, die eine große Anzahl von Dimensionen unterstützen.

Mein Fazit zum Buch: Zu viele Beispiele und Schritt für Schritt Anleitungen statt der Vermittlung von Konzepten. Für den Einstieg, um mal ein Gefühl für das Thema zu bekommen, ok, aber das Wissen kann man sich auch im Internet anlesen. Im Endeffekt ärgere ich mich jedesmal wenn ich im Buch was nachschauen will, und es wieder mal unzureichend erklärt, oder gar nicht drin steht. Ich kann nicht verstehen warum ein Verlag wie MS Press nicht mehr Wert auf qualitativ hochwertige Bücher legt. Ein Hausverlag sollte meiner Meinung nach darauf achten, dass er die besten Bücher zum seinen eigenen Technologien rausbringt.

Beim Entwickeln der letzten Woche bekam ich folgende Meldung von meinem Visual Studio:

Die Execution-Methode wurde erfolgreich ausgeführt, aber die Anzahl von ausgelösten Fehlern (2) hat den maximal zulässigen Wert erreicht (1).
Deshalb tritt ein Fehler auf. Dieses Problem tritt auf, wenn die Anzahl von Fehlern den in ‘MaximumErrorCount’ angegebenen Wert erreicht. Ändern Sie den Wert für ‘MaximumErrorCount’, oder beheben Sie die Fehler.
SSIS-Paket ‘Integration.dtsx’ fertig gestellt: Fehler.

Dazu fällt mir nichts mehr ein.

Ich sah mich in der letzten Woche damit konfrontiert, dass ich aus einer bestehenden unmanged C++ Anwenundung eine C# DLL aufrufen sollte, die wiederum auf einen Webservice zugreifen sollte. Ich habe für das Problem folgende Lösung gefunden:
Man kann aus C++ C# Komponenten aufrufen und diese verwenden. Im einfachsten Fall kann eine C# Komponente als COM Komponente realisiert werden. Auf diese Com-Komponente kann dann C++ zugreifen. Folgende Schritte sind hierfür notwendig:
Der C# Client

  1. In der C# Klasse ein Interface mit Funktionen für die Komponente erstellen
  2. Klasse realisieren, die das Interface erfüllt
  3. Klasse und Interface müssen ab VS05 als COM-Visible deklariert werden
  4. Der Klasse, die das Interface erfüllt muss zusätzlich den Interface Typen deklareien
  5. Damit Schnittstelle und realisierte Klasse im System eindeutig identifiziert werden können, werden diese mit einer GUID versehen.
  6. Damit die Klassen auch sichtbar in COM sind, muss man für das Erstellen “Für COM Interop regestrieren” aktivieren
  7. Meine Erfahrungen zeigen, dass bei der ersten Erstellung die tlb Datei nicht erstellt wird und die Kompoente nicht registriert wird, fesewgen muss diese manuell durch geführt werden
  1. Tlbexp XmlaService.dll
  2. regasm XmlaService.dll /tlb:com.XmlaService.tlb


Beispielhafte Realisierung:


using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace XmlaService
{
[ComVisible(true)]
[Guid("6F032C1C-B862-40dc-9DD2-78ADA8303176")]
public interface IDoService
{
string PerformRequest();
}
[ComVisible (true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid("D4C231A6-1DFD-4add-8039-5B84A0BF0C40")]
public class DoXmlaService:IDoService
{
public DoXmlaService()
{ }

public string PerformRequest()
{
return "JUHU";
}
}
}

Ansprechen der Komponente in unmanged C++

  1. Die C++ KLasse muss einen Verweis auf den genauen Pfad der tlb-Datei besitzen
  2. Zusätzlich müssen noch die Argumente für den Inmport übergeben werden, einen Überblick gibt es unter http://msdn2.microsoft.com/en-us/library/8etzzkb6(VS.80).aspx
  3. Den Aufruf der Komponente muss immer einzeln erfolgen
  4. Ebenfalls sollte darauf geachtet werden, dass tlh, komplett erstellt wurde, Beispiel siehe unten


Beispielhafte Realisierung


#include "stdafx.h"
#import "C:\Dokumente und Einstellungen\yteiken\Desktop\ComZeug\ManagedCOM\MyInterop\bin\Debug\MyInterop.tlb" named_guids raw_interfaces_only
#import "C:\Dokumente und Einstellungen\yteiken\Eigene Dateien\Visual Studio 2005\Projects\XmlaService\XmlaService\bin\Debug\XmlaService.tlb" named_guids raw_interfaces_only

int _tmain(int argc, _TCHAR* argv[])
{
long result;
result = 5;

long parameter;
parameter = 5;
CoInitialize(NULL);
MyInterop::IMyDotNetInterfacePtr pDotNetCOMPtr;

HRESULT hRes = pDotNetCOMPtr.CreateInstance(MyInterop::CLSID_MyDotNetClass);
if (hRes == S_OK)
{
pDotNetCOMPtr->ShowDialog (parameter, &result);
}

CoUninitialize ();

BSTR string;
XmlaService::IDoServicePtr test;
//
//XMLA Interface
HRESULT hRes2 = test.CreateInstance(XmlaService::CLSID_DoXmlaService);
if(hRes2 == S_OK)
{
test->PerformRequest(&string);
}

CoUninitialize ();
return 0;
}

Schreibt man eigene Anwendungen mit viel Texteingabe, so wäre Rechtschreibprüfung ein cooles Feature, da man im Allgemeinen davon ausgehen kann, dass Personen, für die eine .NET Anwendung implementiert wird, auch Word auf ihrem Rechner hat, so kann man doch einfach die Rechtschreibprüfung von Word verwenden. Wie es geht wird hier erklärt, alles relativ einfach.

Ich habe beschlossen mich nun ein wenig mit Ruby zu beschäftigen. Zum Anfang ein paar Link- und eine Buchempfehlung:


Bisher dachte ich ich immer, warum weiß ich auch nicht, dass Serialisierung irgendwas schwieriges und mysteriöses sei, dem ist aber nicht so. Ich musste in der letzen Woche etwas serialisieren, und es ist super leicht. Ich habe meine Objekte binär serialisiert, da List<> schon die entsprechende Schnittstelle zur Serialisierung erfüllt, lassen sich so einfach eigene Objekte sichern:

List myList= new List();
Supervisor frank= new Supervisor();
frank.logInName = “FrankP”;
Supervisor paul= new Supervisor();
sa.logInName = “paulT”;
myList.Add(paul);
myList.Add(frank);
FileStream myStream;
myStream = new FileStream(@”C:\MyObject.dat”, FileMode.Create);
BinaryFormatter binFormatter = new BinaryFormatter();
binFormatter.Serialize(myStream, myList);

Um nun die gespeicherten Objekte wieder zu deserialisieren, sind folgende Anweisungen notwendig:

List oldObj;
BinaryFormatter binFormatter = new BinaryFormatter();
FileStream fs = new FileStream(@”C:\MyObject.dat”, FileMode.Open);
oldObj = (List
)binFormatter.Deserialize(fs);

Und schon ist alles wieder da.

Wenn man sich mal darüber Gedanken macht, ob seine Anwendungen, die man so den ganzen Tag programmiert auch sicher sind, stösst man ziemlich schnell auf SQL Injections, die entstehen können, wenn man seine Queries wie folgt abgibt:
SqlCommand cmd = new SqlCommand("select * from Customers where city = '" + inputCity + "'";

Ich muss gestehen, dass meine Querries so, oder so ähnlich aussehen. In .NET gibt es die Möglichkeit parametrisierte SQL Commands zu verwenden, damit Injections verhindert werden können. Und so sehen diese in der Theorie aus:
SqlCommand cmd = new SqlCommand(
"select * from Customers where city = @City", conn);

// 2. define parameters used in command object
SqlParameter param = new SqlParameter();
param.ParameterName = "@City";
param.Value = inputCity;

// 3. add new parameter to command object
cmd.Parameters.Add(param);

// get data stream
reader = cmd.ExecuteReader();

Da ich aber nun in meiner Anwendung keinen MS SQL Server DB verwende, sondern eine MySql DB, ging das mit den Parametern nicht so wie beschrieben. Laut MySQL Forum muss man das @ durch ein ? ersetzen. Das ging bei mir allerdings auch nicht. Was schließlich ging war:

OdbcConnection con = new Odbc().GetMySqlConnection();
con.Open();
string select = "SELECT Name FROM validation, alidatetypes WHERE validation.validationTypeId = alidatetypes.id AND validation.questionId = ? ";
OdbcCommand com = new OdbcCommand(select, con);

OdbcParameter pid = com.Parameters.Add(new OdbcParameter());
com.Prepare();
pid.Value = id;

try
{
string result = com.ExecuteScalar().ToString();
return result;
}

Laut MS ist das jetzt sicherer, aber ich finde das mit den ? irgendwie hässlich, denn für mich ist das bei mehren Parametern unübersichtlich.

Mit iTextSharp lassen sich ganz passabel mit .NET PDFs generieren. iTextSparp ist ein Port einer Java-Komponente, und soll sich auch mit 2.0 und 3.0 betreiben lassen.

Ich werde dieses Jahr wieder auf der CeBit sein. Dieses Jahr aber nicht nur als Besucher, sonder auch als Speaker (oder Spreaktress??? :-) ) Zusammen mit Hilmar werde ich im MSDN-Entwicklerkino am Samstag dreimal einen Vortrag zum Thema Projekt Hoshimi halten. Die genauen Zeiten:

  • 11:00 - 11:30
  • 13:00 - 13:30
  • 14:00 - 14:30

Des Weiteren werde ich zwischenzeitlich mal auf dem Microsoft Community GetTogether vorbeischauen. Ich würde mich freuen, wenn uns irgendwo sehen.

Next Page »