<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Codehauerei Schwarz</title>
	<atom:link href="http://codehauerei-schwarz.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://codehauerei-schwarz.de</link>
	<description>.NET SQL-Server &#38; more</description>
	<lastBuildDate>Mon, 30 Nov 2009 21:00:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Custom WCF MSMQ-Tracer</title>
		<link>http://codehauerei-schwarz.de/2009/11/30/custom-wcf-msmq-tracer/</link>
		<comments>http://codehauerei-schwarz.de/2009/11/30/custom-wcf-msmq-tracer/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 20:56:26 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[MSMQ]]></category>
		<category><![CDATA[Trace]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=160</guid>
		<description><![CDATA[WCF Custom MSMQ Tracer &#8211; Sample
Das Standard-Traceing im WCF Framework ist erstaunlich einfach anzuwenden und zu konfigurieren. Auch das im Framework enthaltene Analysetool ist ganz brauchbar.
So viel Luxus ist man gar nicht gewohnt wenn man vorher hauptsächlich mit dem WSE-Framework zu tun hatte&#8230;
Leider ist Microsoft den Weg nicht komplett zu Ende gegangen. Gibt man sich [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/WCF-Custom-MSMQ-Tracer.rar">WCF Custom MSMQ Tracer &#8211; Sample</a></p>
<p>Das Standard-Traceing im WCF Framework ist erstaunlich einfach anzuwenden und zu konfigurieren. Auch das im Framework enthaltene Analysetool ist ganz brauchbar.</p>
<p>So viel Luxus ist man gar nicht gewohnt wenn man vorher hauptsächlich mit dem WSE-Framework zu tun hatte&#8230;</p>
<p>Leider ist Microsoft den Weg nicht komplett zu Ende gegangen. Gibt man sich nicht mit der Erzeugung von Logdateien zufrieden, sondern will das Ganze in eine Datenbank  bzw. Message Queue persistieren darf man wieder selbst tätig werden.</p>
<p>Ich würde davon abraten das komplette Traceing direkt synchron aufzusetzen. Es hat sich bewährt die Nachrichten zuerst einmal zwischenzulagern und die Verarbeitung dann asynchron auszuführen.</p>
<pre class="brush:[c#]">public class MsmqTracer : TraceListener
{
   public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
        	{
   // ein übler hack um app settings in class libs verfügbar zu machen
   string traceQueue = ConfigurationManager.AppSettings["TraceQueue"];

   if (!string.IsNullOrEmpty(traceQueue))
   {
      try
      {
      MessageQueue msmq = new MessageQueue(traceQueue);
      MessageQueueTransaction trans = new MessageQueueTransaction();

      trans.Begin();
      Message msg = new Message(data.ToString(), new XmlMessageFormatter());

      msmq.Send(msg, trans);
      trans.Commit();
      }

      catch (Exception msmqEx)
      {
         Debug.WriteLine(string.Format("Error while persisting trace: {0}", msmqEx.ToString()));
      }
   }
   else
   {
      Debug.WriteLine("Missing MSMQ Trace");
   }
}

public override void Write(string message) {}

public override void WriteLine(string message) {}</pre>
<pre class="brush:[xml]">
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <system.diagnostics>
  <sources>
   <source name="System.ServiceModel.MessageLogging" switchValue="Verbose,ActivityTracing">
<listeners>
     <add type="System.Diagnostics.DefaultTraceListener" name="Default">
      <filter type=""/>
       </add>
      <add name="ServiceModelMessageLoggingListener">
       <filter type=""/>
       </add>
      </listeners>
   </source>
  </sources>

  <sharedListeners>
   <add name="ServiceModelMessageLoggingListener" type="Trace.MsmqTracer, Trace" />
  </sharedListeners>
 </system.diagnostics>

 <system.serviceModel>
  <!-- Perfmon -->
  <diagnostics performanceCounters="All">
   <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
  </diagnostics>

  <behaviors>
   <serviceBehaviors>
    <behavior name="mex">
     <serviceMetadata httpGetEnabled="true" />
    </behavior>
   </serviceBehaviors>
  </behaviors>

  <services>
   <service behaviorConfiguration="mex" name="TestService.Test">
    <endpoint address="TestService" binding="wsHttpBinding" bindingConfiguration=""
     name="TestServiceWsHttpEndpoint" contract="TestService.ITest" />
     <host>
      <baseAddresses>
       <add baseAddress="http://localhost:11111/" />
      </baseAddresses>
     </host>
    </service>
  </services>
 </system.serviceModel>

 <!-- Trace Queue -->
  <appSettings>
   <add key="TraceQueue" value="formatname:DIRECT=OS:.\private$\Trace" />
  </appSettings>

</configuration>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2009/11/30/custom-wcf-msmq-tracer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF Performance Counter</title>
		<link>http://codehauerei-schwarz.de/2009/11/30/wcf-performance-counter/</link>
		<comments>http://codehauerei-schwarz.de/2009/11/30/wcf-performance-counter/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 20:00:39 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=150</guid>
		<description><![CDATA[Das WCF-Framework stellt eine Unzahl an Meßwerten zur Verfügung.
Leider ist das Ganze kaum dokumentiert&#8230;
Die Aktivierung der Counter ist denkbar einfach (wenn man mal rausgefunden hat dass es sowas überhaupt gibt&#8230;) und erfolgt durch einen Eintrag in der App.Config des Hosts

Die entsprechenden Werte lassen sich dann direkt mit perfmon anzeigen und auswerten.


]]></description>
			<content:encoded><![CDATA[<p>Das WCF-Framework stellt eine Unzahl an Meßwerten zur Verfügung.</p>
<p>Leider ist das Ganze kaum dokumentiert&#8230;</p>
<p>Die Aktivierung der Counter ist denkbar einfach (wenn man mal rausgefunden hat dass es sowas überhaupt gibt&#8230;) und erfolgt durch einen Eintrag in der App.Config des Hosts</p>
<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/PerfCountersConfig.png"><img class="alignnone size-full wp-image-151" title="PerfCountersConfig" src="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/PerfCountersConfig.png" alt="PerfCountersConfig" width="362" height="49" /></a></p>
<p>Die entsprechenden Werte lassen sich dann direkt mit perfmon anzeigen und auswerten.</p>
<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/perfmon1.png"><img class="alignnone size-full wp-image-152" title="perfmon1" src="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/perfmon1.png" alt="perfmon1" width="584" height="386" /></a></p>
<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/perfmon2.png"><img class="alignnone size-full wp-image-154" title="perfmon2" src="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/perfmon2.png" alt="perfmon2" width="461" height="532" /></a><a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/perfmon2.png"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2009/11/30/wcf-performance-counter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excel Dateien mit SQL auswerten</title>
		<link>http://codehauerei-schwarz.de/2009/11/11/excel-dateien-mit-sql-auswerten/</link>
		<comments>http://codehauerei-schwarz.de/2009/11/11/excel-dateien-mit-sql-auswerten/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 09:10:52 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[OPENDATASOURCE]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=125</guid>
		<description><![CDATA[Excel Query
Excel 97 &#8211; 2003
SELECT

     [ID], -- Excel Spalte 1
     [Text] -- Excel Spalte 2

FROM

     OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
     'Data Source=C:\test.xls;Extended Properties=Excel 8.0')
     ...[Tabelle1$] -- Tabellenblatt

ORDER BY

[ID] DESC
Excel 2007:
Um die Funktionalität auch bei .xslx-Dateien nutzen zu können, muß folgende Komponente auf dem System installiert sein:
2007 Office System Driver: Data Connectivity Components
 
SELECT
	*
FROM
	OPENDATASOURCE(
		'Microsoft.ACE.OLEDB.12.0',
		'Data Source=C:\test.xlsx;Extended Properties=Excel 12.0')
		...[Tabelle1$]
Leider funktioniert das Ganze aktuell nur [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/Excel-Query.rar">Excel Query</a></p>
<p><strong>Excel 97 &#8211; 2003</strong></p>
<pre class="brush:[sql]">SELECT

     [ID], -- Excel Spalte 1
     [Text] -- Excel Spalte 2

FROM

     OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
     'Data Source=C:\test.xls;Extended Properties=Excel 8.0')
     ...[Tabelle1$] -- Tabellenblatt

ORDER BY

[ID] DESC</pre>
<p><strong>Excel 2007:</strong></p>
<p>Um die Funktionalität auch bei .xslx-Dateien nutzen zu können, muß folgende Komponente auf dem System installiert sein:<br />
<a href="http://www.microsoft.com/downloads/details.aspx?familyid=7554F536-8C28-4598-9B72-EF94E038C891&amp;displaylang=en">2007 Office System Driver: Data Connectivity Components</a><br />
 </p>
<pre class="brush:[sql]">SELECT
	*
FROM
	OPENDATASOURCE(
		'Microsoft.ACE.OLEDB.12.0',
		'Data Source=C:\test.xlsx;Extended Properties=Excel 12.0')
		...[Tabelle1$]</pre>
<p>Leider funktioniert das Ganze aktuell nur auf 32-Bit Systemen, da die entsprechenden Provider auf 64-Bit Systemen derzeit nicht zur Verfügung gestellt werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2009/11/11/excel-dateien-mit-sql-auswerten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>X-Server SQL Query Template mit OPENROWSET</title>
		<link>http://codehauerei-schwarz.de/2009/11/04/x-server-sql-query-template-mit-openrowset/</link>
		<comments>http://codehauerei-schwarz.de/2009/11/04/x-server-sql-query-template-mit-openrowset/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 14:38:40 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[OPENROWSET]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=113</guid>
		<description><![CDATA[
SELECT * FROM OPENROWSET
      ('MSDASQL', 'DRIVER={SQL Server};SERVER=zensiert;UID=zensiert;PWD=zensiert,
      Testdatenbank.Schema.TestTabelle) 

      WHERE ...

Um dieses Feature nutzen zu können muss folgendes Setting aktiviert sein

EXEC sp_configure 'Ad Hoc Distributed Queries', '1' RECONFIGURE

http://technet.microsoft.com/de-de/library/ms187569.aspx
]]></description>
			<content:encoded><![CDATA[<pre class="brush:[sql]">
SELECT * FROM OPENROWSET
      ('MSDASQL', 'DRIVER={SQL Server};SERVER=zensiert;UID=zensiert;PWD=zensiert,
      Testdatenbank.Schema.TestTabelle) 

      WHERE ...
</pre>
<p>Um dieses Feature nutzen zu können muss folgendes Setting aktiviert sein</p>
<pre class="brush:[sql]">
EXEC sp_configure 'Ad Hoc Distributed Queries', '1' RECONFIGURE
</pre>
<p>http://technet.microsoft.com/de-de/library/ms187569.aspx</p>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2009/11/04/x-server-sql-query-template-mit-openrowset/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Cursor Template</title>
		<link>http://codehauerei-schwarz.de/2009/11/04/sql-cursor-template/</link>
		<comments>http://codehauerei-schwarz.de/2009/11/04/sql-cursor-template/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 14:14:41 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Cursor]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=109</guid>
		<description><![CDATA[
DECLARE @lastname varchar(100)
DECLARE @firstname varchar(100)

DECLARE query_cursor CURSOR FOR

	SELECT
		LastName,
		FirstName
	FROM
		T_AddressData
	ORDER BY
		PK_AddressData

OPEN query_cursor

FETCH NEXT FROM query_cursor
INTO @lastname, @firstname

PRINT '---------- Results ----------'

WHILE @@FETCH_STATUS = 0
BEGIN
	PRINT (@lastname + ' ' + @firstname)

	FETCH NEXT FROM query_cursor
	INTO @lastname, @firstname
END

CLOSE query_cursor
DEALLOCATE query_cursor

]]></description>
			<content:encoded><![CDATA[<pre class="brush:[sql]">
DECLARE @lastname varchar(100)
DECLARE @firstname varchar(100)

DECLARE query_cursor CURSOR FOR

	SELECT
		LastName,
		FirstName
	FROM
		T_AddressData
	ORDER BY
		PK_AddressData

OPEN query_cursor

FETCH NEXT FROM query_cursor
INTO @lastname, @firstname

PRINT '---------- Results ----------'

WHILE @@FETCH_STATUS = 0
BEGIN
	PRINT (@lastname + ' ' + @firstname)

	FETCH NEXT FROM query_cursor
	INTO @lastname, @firstname
END

CLOSE query_cursor
DEALLOCATE query_cursor
</pre>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2009/11/04/sql-cursor-template/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rekursive SQL Queries &#8211; Common Table Expression</title>
		<link>http://codehauerei-schwarz.de/2009/11/02/rekursive-sql-queries-common-table-expression/</link>
		<comments>http://codehauerei-schwarz.de/2009/11/02/rekursive-sql-queries-common-table-expression/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 16:03:24 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[CTE]]></category>
		<category><![CDATA[Rekursion]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=89</guid>
		<description><![CDATA[CTE Rekursion &#8211; Sample
 


WITH TEMP (Pk, Parent_Pk, Title, Name, Iteration) AS
(
  SELECT Pk_JobStruct, Fk_Parent, Title, Name, 0
  FROM T_JobStruct
  WHERE PK_JobStruct = 1 -- el cheffe
 
 UNION ALL
 
  SELECT sub.Pk_Jobstruct, sub.Fk_Parent, sub.Title, sub.Name, (t.Iteration + 1)
  FROM T_JobStruct AS sub, temp AS t
  WHERE t.Pk = sub.Fk_Parent
 
)

SELECT * FROM Temp


]]></description>
			<content:encoded><![CDATA[<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/CTE-Rekursion.txt">CTE Rekursion &#8211; Sample</a><br />
 <br />
<a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/rec_result.png"><img class="alignnone size-full wp-image-96" title="rec_result" src="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/rec_result.png" alt="rec_result" width="378" height="205" /></a></p>
<pre class="brush:[sql]">
WITH TEMP (Pk, Parent_Pk, Title, Name, Iteration) AS
(
  SELECT Pk_JobStruct, Fk_Parent, Title, Name, 0
  FROM T_JobStruct
  WHERE PK_JobStruct = 1 -- el cheffe
 
 UNION ALL
 
  SELECT sub.Pk_Jobstruct, sub.Fk_Parent, sub.Title, sub.Name, (t.Iteration + 1)
  FROM T_JobStruct AS sub, temp AS t
  WHERE t.Pk = sub.Fk_Parent
 
)

SELECT * FROM Temp
</pre>
<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/rec_cte_queryresult.png"><img class="alignnone size-full wp-image-101" title="rec_cte_queryresult" src="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/rec_cte_queryresult.png" alt="rec_cte_queryresult" width="359" height="197" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2009/11/02/rekursive-sql-queries-common-table-expression/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webservice Traces mit WSE 2.0</title>
		<link>http://codehauerei-schwarz.de/2009/10/30/webservice-traces-mit-wse-2-0/</link>
		<comments>http://codehauerei-schwarz.de/2009/10/30/webservice-traces-mit-wse-2-0/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 12:53:58 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[WebService]]></category>
		<category><![CDATA[WSE]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=42</guid>
		<description><![CDATA[WSE 2.0 Trace Sample
Auch wenn in der Webservice-Entwicklung mittlerweile größtenteils das WCF-Framework eingesetzt wird, haben wir alle bestimmt noch die eine oder andere &#8220;ältere&#8221; Anwendung zu betreuen.
Tritt ein Bug auf, schadet es nie zuerst einen Blick auf die entsprechenden Daten zu werfen. Während das Ganze im WCF-Framework mit einigen Mausklicks erledigt ist oder man nicht [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://codehauerei-schwarz.de/wp-content/uploads/2009/10/WSE-2.0-Trace-Sample.rar'>WSE 2.0 Trace Sample</a></p>
<p>Auch wenn in der Webservice-Entwicklung mittlerweile größtenteils das WCF-Framework eingesetzt wird, haben wir alle bestimmt noch die eine oder andere &#8220;ältere&#8221; Anwendung zu betreuen.</p>
<p>Tritt ein Bug auf, schadet es nie zuerst einen Blick auf die entsprechenden Daten zu werfen. Während das Ganze im WCF-Framework mit einigen Mausklicks erledigt ist oder man nicht sowieso ein asychrones Traceing aufgesetzt hat ist bei den Web Service Enhancements ein wenig mehr zu tun.</p>
<p><strong>Das Ganze ist allerdings mit Vorsicht zu genießen und sollte auf Produktiv-Systemen relativ zügig wieder deaktiviert werden da die entsprechenden Dateien relativ schnell anwachsen&#8230;</strong></p>
<p>- Referenz auf die entsprechende WSE Assembly einfügen</p>
<p><img class="alignleft size-full wp-image-44" title="wsetrace1" src="http://codehauerei-schwarz.de/wp-content/uploads/2009/10/wsetrace11.png" alt="wsetrace1" width="234" height="142" /></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>- Die Vererbung der generierten Client-Klasse anpassen</p>
<p>Reference.cs</p>
<pre class="brush:[c#]">public partial class GlobalWeather : Microsoft.Web.Services2.WebServicesClientProtocol</pre>
<p> </p>
<p>- App.config der Anwendung erweitern</p>
<pre class="brush:[xml]">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;configuration&gt;
    &lt;configSections&gt;
 ...
      &lt;section name="microsoft.web.services2" type="Microsoft.Web.Services2.Configuration.WebServicesConfiguration, Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&gt;
    &lt;/configSections&gt;
 ...
  &lt;microsoft.web.services2&gt;
    &lt;diagnostics&gt;
      &lt;trace enabled="true"
        input="inputTrace.webinfo"
        output="outputTrace.webinfo"/&gt;
    &lt;/diagnostics&gt;
  &lt;/microsoft.web.services2&gt;
&lt;/configuration&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2009/10/30/webservice-traces-mit-wse-2-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
