Replace von CHAR(0) in SQL Server varchar-Spalte

by Wolfgang Kluge Juni 30, 2009 18:46

Heute kam es in einem meiner Projekt zu folgendem Fehler

Msg 6841, Level 16, State 1, Line 1
FOR XML konnte die Daten für den 'Tabelle'-Knoten nicht serialisieren, weil ein in XML unzulässiges Zeichen (0x0000) enthalten ist. Um diese Daten mithilfe von FOR XML abzurufen, konvertieren Sie sie in den Datentyp 'binary', 'varbinary' oder 'image', und verwenden Sie die BINARY BASE64-Direktive.

Nach kurzem Suchen bemerkte ich dann, dass nicht die Ausgabe mittels FOR XML fehlerhaft war, sondern in einzelnen Feldern einer Tabelle CHAR(0)-Zeichen enthalten waren, die da nicht hingehörten. Die Tabelle wird von anderer Stelle gefüllt und eigentlich wird dabei der entsprechende Text abgeschnitten, dieses Sonderzeichens in dem Fall wohl aber nicht mehr. Nachdem die Befüllung geändert wurde, mussten die bereits geschriebenen CHAR(0)-Einträge noch geändert werden, doch dass stellte sich als schwerer heraus als zuerst angenommen. Sicher war, dass die Zeichen nur am Ende eines Textes vorkamen. Zum Testen gab es folgende temporäre Tabelle

DECLARE @test table(
    Name varchar(30) NULL COLLATE Latin1_General_CI_AS
)
INSERT INTO @test (Name)
           SELECT 'Hallo Welt 1' + CHAR(0) + CHAR(0) + CHAR(0) + CHAR(0)
 UNION ALL SELECT 'Hallo Welt 2' + CHAR(0)
 UNION ALL SELECT 'Hallo Welt 3'
 UNION ALL SELECT ''
 UNION ALL SELECT CHAR(0)
 UNION ALL SELECT CHAR(0) + CHAR(0)
 UNION ALL SELECT NULL

Das Problem sollte schnell gelöst werden können.

UPDATE  @test
SET     Name = SUBSTRING(Name, 1, CHARINDEX(CHAR(0), Name) - 1)
WHERE   Name LIKE '%' + CHAR(0) + '%'

Sieht einfach aus, macht - zumindest theoretisch - genau dass, was ich will, funktioniert aber nicht :(

vollständigen Artikel anzeigen...

Tags: ,

Microsoft SQL Server

Das IIS 7 SEO Toolkit und Live-Seiten

by Wolfgang Kluge Juni 29, 2009 16:50

Die "Site Analysis" des IIS Search Engine Optimization Toolkits kann gut verwendet werden, um allgemein Fehler auf der eigenen Seite zu finden. Wenn man denn will kann man damit die Seite recht einfach "sauber" (z.B. von ungültigen Links) halten oder Fehler im HTML-Code entdecken. Die Sache hat nur einen Haken - das Toolkit läuft nur auf dem IIS 7. Wenn man nunmal Live aber wesentlich mehr Daten vorhält als lokal, dann (so mein erster Eindruck) muss auch das Toolkit Live installiert werden um die Seite vollständig testen zu können. Mal abgesehen davon, dass es nicht stimmt *g*, könnte auf dem Server aber auch IIS 6 oder Apache laufen oder man hat einfach überhaupt keinen administrativen Zugriff auf den Rechner.

Nun gibt es die Möglichkeit, die live-Seite lokal nachzubilden. Doch hat das wiederum einen weiteren Haken - lokal könnten komplett andere Einstellungen vorzufinden sein, eventuell fehlen weitere Server im Verbund, auf die man lokal aber auch gar nicht mehr zugreifen kann/darf. Und zudem müssten/sollten alle Einstellungen exakt gleich sein. Mal ehrlich. ich hab noch nie überprüft, ob Liste der Content-Types auch exakt gleich ist (und ich hatte es eigentlich auch nicht vor *g*).

Die Lösung ist recht simpel - wenn man sie denn kennt: das Toolkit braucht immer noch einen IIS 7, aber dieser kann sich befinden, wo es auch immer beliebt. Die zu analysierende Website muss nicht zwingend auf dem gleichen Rechner vorhanden sein. Nachdem man eine neue Seite mit beliebigem physikalischem Verzeichnis eingerichtet hat, muss man nur noch den richtigen Hostnamen wählen. In meinem Beispiel ist das KlugeSoftware.de.

vollständigen Artikel anzeigen...

Tags: ,

IIS 7.0

Fehler 404 beim Aufruf von BTSHTTPReceive.dll

by Wolfgang Kluge Mai 20, 2009 18:58

Heute stieß ich auf einen mir seltsam erscheinenden Fehler. Ich hatte AS2-Daten von einem Partner bekommen und habe diese eingerichtet. Beim ersten Test kam es dann gleich zum Fehler 404 "File not found" bzw. "Datei nicht gefunden". Das wollte ich prüfen und nachdem ich die URL in den Browser eingegeben hatte, erschien auch die selbe Fehlermeldung. Beim Aufruf des Verzeichnisses wurde die Datei allerdings noch - wie im Bild zu sehen - angezeigt.

Die Datei ist also vorhanden. Verwirrend.

Die Lösung ist ganz einfach, wenn man sie denn kennt ;) Innerhalb der Web Service Extensions im IIS Manager muss diese DLL eingetragen und die Ausführung erlaubt werden.

Tags: ,

Microsoft BizTalk Server

MSDN Blog-Parade : Lieblings-Entwickler-Tools

by Wolfgang Kluge Mai 20, 2009 14:43

Die MSDN Blog-Parade zum Thema Lieblings-Tools erfreut sich doch recht großer Beliebtheit (obs an der Gewinnmöglichkeit liegt, ich weiß es nicht *g*). Ich habe lange überlegt, welches denn meine 3 Lieblings-Tools sind und kam zu folgendem Ergebnis:

  1. ReSharper
    Erleichtert die tägliche Arbeit schon ungemein. Es geht sicherlich auch ohne, aber ich möchte es nicht mehr wirklich missen.
  2. AnkhSVN
    Wobei es eigentlich egal ist, mit welcher Versionskontrolle man arbeitet - Hauptsache man tut es und es ist halbwegs gut in die Entwicklungsumgebung integriert ;)
  3. Browser/Internet/Blogs & Foren
    Ja, der Browser wird seltener genannt, aber ohne Browser (und natürlich ohne Internet und ohne die zahlreichen Blogs, Foren und sonstigen Hilfeseiten) wäre mein Leben als Entwickler durchaus hürdenreicher

Visual Studio und/oder eine andere Entwicklungsumgebung wie #develop hab ich (wie Alex Zeitler in seiner Liste) mal nicht genannt - das gehört einfach zum Basis-Set dazu *g*...

Tags:

Microsoft Visual Studio

URL Rewrite und der SiteMap-Provider (Request.PathInfo)

by Wolfgang Kluge Mai 13, 2009 20:03

Heute wollte ich einer meiner Seiten so umstellen, dass URL-Rewrite verwendet wird. Das ging auch recht schnell (entsprechende Links gesetzt und über Request.PathInfo die Parameter ausgelesen), allerdings stellte sich beim Testen dann heraus, dass ich ein Problem mit dem Menü hatte. Dieses konnte nun nicht mehr die aktuelle Seite markieren... Das Menü wird über eine Sitemap erstellt.

Verkürzt sieht der Code für das Menü so aus:

<asp:SiteMapDataSource ID="MenuSource" runat="server" SiteMapProvider="menu" />
<asp:Menu ID="mnu" runat="server" DataSourceID="MenuSource">

In meiner Sitemap sind die entsprechenden URLs eingetragen. Z.B.

<siteMapNode title="Startseite" url="~/default.aspx" />
<siteMapNode title="Projekte" url="~/projects.aspx"/>
<siteMapNode title="Eigene Projekte" url="~/projects.aspx/own"/>

Wird die Seite "/projects.aspx" aufgerufen, so wird der Eintrag "Projekte" entsprechend gekennzeichnet (mittels CSS-Class "AspNet-Menu-Selected"). Das hat auch noch mit "/projects.aspx?test=1" wunderbar funktioniert. Wird dagegen die Seite "/projects.aspx/test" aufgerufen, wird der entsprechende Eintrag nicht mehr gefunden, da mit Request.RawURL verglichen wird. Und da steht "/projects/test" drin.

Es ist also nur verständlich, dass der Provider den Eintrag nicht findet und dementsprechend kein Menüeintrag als aktiv gekennzeichnet werden kann. Erschwerend kommt hinzu, dass durchaus auch mal ein Treffer dabei sein kann (wie in diesem Beispiel beim Aufruf von "/projects.aspx/own").

Da hilft nur selbst den richtigen Eintrag suchen. Das ist natürlich nur nötig, wenn Request.PathInfo gefüllt ist.

protected override void OnInit( EventArgs e ) {
    base.OnInit( e );
    if( MenuSource.Provider.CurrentNode == null && !string.IsNullOrEmpty( Request.PathInfo ) ) {
        MenuSource.Provider.SiteMapResolve += new SiteMapResolveEventHandler( SiteMap_SiteMapResolve );
    }
}

private SiteMapNode SiteMap_SiteMapResolve( object sender, SiteMapResolveEventArgs e ) {
    SiteMapProvider provider = sender as SiteMapProvider;
    if( provider == null ) return null;
    return provider.FindSiteMapNode( e.Context.Request.AppRelativeCurrentExecutionFilePath );
}

Sobald MenuSource.Provider.CurrentNode == null ist und in Request.PathInfo etwas steht, wird auf das Ereignis SiteMapResolve des Providers reagiert. Dort wird nach einem Eintrag im aktuellen SiteMapProvider gesucht, der nur dem Pfad (ohne PathInfo-Angaben) entspricht.

Wenn man das Menü innerhalb eines Controls hat (wo es hingehört *g*), muss der Code auch nur 1x angegeben werden.

Tags: , ,

ASP.NET

Die 2 Fragezeichen ?? ... und die null

by Wolfgang Kluge Mai 03, 2009 13:26

Nicht unbekannt - aber dennoch nicht gerade oft verwendet - fristet der c#-Operator ?? sein dasein. Zu Unrecht? Lässt sich doch mit diesem recht einfach testen, ob in einer Objektvariable ein Objekt oder null steht und entsprechend etwas anderes zurückgeben. In dem Beispiel

string test1 = null, test2 = "irgendwas";
Trace.WriteLine( test1 ?? "(null)" );
Trace.WriteLine( test2 ?? "(null)" );

wird - wie man sich bestimmt schon denken kann - zuerst "(null)" und dann "irgendwas" ausgegeben. Oder zu Deutsch: Es wird der linke Operand zurückgegeben, falls dieser nicht null ist, ansonsten wird der rechte Operand zurückgegeben.

Damit wird einem c#-Entwickler eine sehr einfache und leserliche Möglichkeit gegeben, auf null-Werte zu reagieren. Selbstverständlich kann man mit dieser Schreibweise auch "Schindluder" betreiben und den Code so unleserlich wie nur irgend möglich gestalten. Wenn man das aber nicht vorhat, warum dann nicht verwenden?

vollständigen Artikel anzeigen...

Tags:

C#

Partitionierte Views anlegen

by Wolfgang Kluge Mai 02, 2009 12:23

Mit Partitionierung ist ein Aufteilen der Daten anhand bestimmter Kriterien gemeint - vor allem riesige Datenbestände können so einen echten Performancegewinn "erleiden" ;) Man kann dabei auch auf Remote-Tabellen zugreifen(Distributed Partitioned View) - aber dieser Artikel soll nur eine kleine Einführung geben.

Partitionierte Views sind dabei kein wirklicher Ersatz für die partitionierten Tabellen. Man kann sich aber zumindest teilweise helfen.

Eine partitionierte View und deren Tabellen unterliegen einigen Einschränkungen. So muss die Kriteriumsspalte innerhalb des Primary Keys vorkommen (oder selbst der Primary Key sein) und eine Identity-Spalte führt zum Fehler. Alle Tabellen müssen gleiche Primary Keys vorweisen. Das Kriterium muss der jeweiligen Tabelle mittels CHECK-Einschränkung bekannt gegeben werden. Dabei darf die CHECK-Einschränkung nur aus folgenden Operatoren bestehen: AND, OR, BETWEEN, <, <=, =, >= und >. Da gibt es noch ein paar Einschränkungen, aber für den Anfang muss das ausreichen...

vollständigen Artikel anzeigen...

Tags: ,

Microsoft SQL Server

Views mit INSTEAD OF UPDATE-Trigger

by Wolfgang Kluge Mai 01, 2009 18:01

Ich stand vor der Problemstellung, eine Tabelle zu optimieren, da die Tabelle an vielen Stellen verwendet wird aber gleichzeitig dafür zu sorgen, dass die Umstellung "abwärtskompatibel" bleibt.

Die Tabelle ist schon etwas älter, mittlerweile gut gefüllt und es werden einige Daten ständig wiederholt - ich wollte also als erstes mal umstrukturieren. Mein erster Gedanke war, eine View zu verwenden, damit andere Abfragen noch genauso funktionieren wie zuvor. Am Anfang reicht es aus, die "wichtigsten" Abfragen zu optimieren und mit der Zeit könnte man dann langsam alle anderen Abfragen ändern sprich optimieren.

Gesagt, getan. Ich habe also die Tabellen angelegt und eine View nach dem Vorbild der Ursprungstabelle angelegt (und aus Performancegründen eine Indexed View verwendet). Damit auch INSERT-, UPDATE- und DELETE-Anweisungen weiterhin funktionieren, wurden entsprechende INSTEAD OF-Trigger geschrieben...

Doch dann durchkreuzte eine simple aber folgenreiche Fehlermeldung mein ganzes Vorhaben.

Msg 414, Level 16, State 1, Line <line>
UPDATE ist nicht zulässig, weil die Anweisung die "<view name>"-Sicht aktualisiert, die an einer Verknüpfung beteiligt ist und einen INSTEAD OF UPDATE-Trigger aufweist.

bzw.

Msg 414, Level 16, State 1, Line <line>
UPDATE is not allowed because the statement updates view <view name> which participates in a join and has an INSTEAD OF UPDATE trigger

vollständigen Artikel anzeigen...

Tags: ,

Microsoft SQL Server

BizTalk 2009: Ein Feature das keines ist

by Wolfgang Kluge April 29, 2009 18:31

Das neue Projektformat der BizTalk-Projekte lässt einiges erhoffen. Neben MSBuild-Deploys z.B. auch, dass unterschiedliche Elemente wie z.B. C#-Dateien mit eingefügt werden können. Und tatsächlich ist sogar schon eine *.cs-Datei in neuen BizTalk-Projekten enthalten: AssemblyInfo.cs.

Und diese ist nicht nur proforma vorhanden, sondern wird tatsächlich auch vom C#-Compiler kompiliert.

vollständigen Artikel anzeigen...

Tags:

Microsoft BizTalk Server

BizTalk Server 2009 verfügbar

by Wolfgang Kluge April 28, 2009 10:56

Seit heute ist der BizTalk Server 2009 verfügbar. Eine 120-Tage-Testversion gibt's hier zum download.

Neben Verbesserungen an den Adaptern ist auch das Entwickeln der Orchestrations und Mappings vereinfacht worden. BizTalk-Projekte sind nun (wie C#- oder VB.NET-Projekte) echte "MSBuild-Projekte" (ich kenn keinen anderen Namen dafür). Dadurch steht einer Unterstützung von MSBuild (was zuvor mit vielen kleinen Hilfsmitteln auch ging) und Team Foundation Server nichts mehr im Weg, Der SQL Server 2008 wird nun unterstützt und auch die Unterstützung von SQL Server 2005 wurde verbessert.

Mit Visual Studio 2008 lassen sich die Projekte nun debuggen (z.B. Map debug), Unit Tests unterziehen und mittels MSBuild auch automatisierte Builds erstellen. Zudem wird ein Optimierter EDI- und AS2-Support versprochen... Und sowieso ist alles besser ;)

Vieles ging auch vorher - nur wesentlich umständlicher. Um z.B. ein Mapping zu debuggen musste man sich mittels "Validate Map" den XSLT-Code ausgeben und diesen dann mit XSLT-Debug debuggen.

Tags:

Microsoft BizTalk Server

Powered by BlogEngine.NET 1.6.1.6
Theme by Mads Kristensen | Modified by Mooglegiant and me ;)