<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>\Stefan\Blog - C-Sharp</title>
    <link>http://www.gueggel.de/blog/</link>
    <description>Gedanken und andere Abgründe</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 1.5.5 - http://www.s9y.org/</generator>
    <pubDate>Sat, 13 Aug 2011 14:16:22 GMT</pubDate>

    <image>
        <url>http://stefanjahn.de/data/media/blog/avatar.png</url>
        <title>RSS: \Stefan\Blog - C-Sharp - Gedanken und andere Abgründe</title>
        <link>http://www.gueggel.de/blog/</link>
        <width>70</width>
        <height>100</height>
    </image>

<item>
    <title>FindAll() des DirectorySearcher und mehr als 1000 Objekte</title>
    <link>http://www.gueggel.de/blog/eintrag/2011-08-13-FindAll-des-DirectorySearcher-und-mehr-als-1000-Objekte.html</link>
            <category>C-Sharp</category>
    
    <comments>http://www.gueggel.de/blog/eintrag/2011-08-13-FindAll-des-DirectorySearcher-und-mehr-als-1000-Objekte.html#comments</comments>
    <wfw:comment>http://www.gueggel.de/blog/wfwcomment.php?cid=1123</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.gueggel.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1123</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Wer die Methode &lt;code&gt;FindAll()&lt;/code&gt; des &lt;code&gt;DirectorySearcher&lt;/code&gt;-Objektes benutzt hat, wird bestimmt schon, je nach LDAP-Filter, festgestellt haben das nur maximal 1000 gefundene Objekte zurückgeliefert werden. Das liegt daran das in den Einstellungen des &lt;span class=&quot;caps&quot;&gt;ADS&lt;/span&gt; diese Grenze festgelegt ist. In der Standardeinstellung, wenn man nichts auf dem Server geändert hat, steht der Wert auf 1000.&lt;/p&gt;

	&lt;p&gt;Was tun wenn man nun aber mehr als 1000 Objekte abfragen sollte?&lt;/p&gt;

	&lt;p&gt;Schnell fällt der Blick auf die Eigenschaft &lt;code&gt;SizeLimit&lt;/code&gt; des &lt;code&gt;DirectorySearcher&lt;/code&gt;-Objektes. Setzt man diesen Wert aber auf z.B. 2000 so bekommt man dennoch nur 1000 Objekte mit &lt;code&gt;FindAll()&lt;/code&gt; zurückgeliefert. Man kann mit &lt;code&gt;SizeLimit&lt;/code&gt; die Anzahl der Objekte nach unten begrenzen, aber nicht über die Server-Grenze hinausgehen.&lt;/p&gt;

	&lt;p&gt;Die korrekte Lösung findet man in der Eigenschaft &lt;code&gt;PageSize&lt;/code&gt; des &lt;code&gt;DirectorySearcher&lt;/code&gt;-Objektes. Hat man diesen Wert nicht geändert, so steht er auf 0. Dies bedeutet das maximal die besagten 1000 Objekte &amp;#8211; also die Server-Grenze &amp;#8211; abgefragt werden.&lt;/p&gt;

	&lt;p&gt;&lt;code&gt;searcher.PageSize = 2000&lt;/code&gt;&lt;br /&gt;
Erhöht man nun den Wert auf 2000 so wird man feststellen das man immer noch 1000 Objekte mit &lt;code&gt;FindAll()&lt;/code&gt; geliefert bekommt. Eine Erhöhung des Wertes von &lt;code&gt;PageSize&lt;/code&gt; über die Server-Grenze ist nicht möglich bzw. erlaubt. Der &lt;span class=&quot;caps&quot;&gt;ADS&lt;/span&gt; ignoriert den Wert dann einfach.&lt;/p&gt;

	&lt;p&gt;&lt;code&gt;searcher.PageSize = 1000&lt;/code&gt;&lt;br /&gt;
Setzt man den Wert auf 1000, also auf die Grenze die im &lt;span class=&quot;caps&quot;&gt;ADS&lt;/span&gt; eingestellt ist, so erhält man mit &lt;code&gt;FindAll()&lt;/code&gt; auch mehr als 1000 Objekte. Die Abfrage erfolgt nun Seitenweise im Hintergrund an die &lt;span class=&quot;caps&quot;&gt;ADS&lt;/span&gt;. Hat man &lt;code&gt;PageSize&lt;/code&gt; gesetzt, so sollte man das &lt;code&gt;DirectorySearcher&lt;/code&gt;-Objekt via &lt;code&gt;Dispose()&lt;/code&gt; nach der Benutzung aufräumen.&lt;/p&gt;

&lt;pre&gt;try {
    searcher = new DirectorySearcher();
    searcher.PageSize = 1000;

    // Weitere Einstellungen für searcher

    results = searcher.FindAll();

    // Ergebnis bearbeiten
} catch {
    throw;
}
finally {
    if (searcher != null) searcher.Dispose();
    if (results != null) results.Dispose();
}
 
&lt;/pre&gt; 
    </content:encoded>

    <pubDate>Sat, 13 Aug 2011 16:16:22 +0200</pubDate>
    <guid isPermaLink="false">http://www.gueggel.de/blog/eintrag/2011-08-13-1123.html</guid>
    <category>ADS</category>

</item>
<item>
    <title>DataTable sortieren</title>
    <link>http://www.gueggel.de/blog/eintrag/2011-07-11-DataTable-sortieren.html</link>
            <category>C-Sharp</category>
    
    <comments>http://www.gueggel.de/blog/eintrag/2011-07-11-DataTable-sortieren.html#comments</comments>
    <wfw:comment>http://www.gueggel.de/blog/wfwcomment.php?cid=1116</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.gueggel.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1116</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Wenn man Tabellen mit Daten aus einer Datenbank füllt ist die Sortierung eigentlich kein Problem. Man gestaltet entsprechend die Datenbankabfrage (&lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt;) und sortiert die Datensätze schon beim Einlesen der Daten.&lt;/p&gt;

	&lt;p&gt;Was ist aber wenn man die Datensätze schon in einer &lt;code&gt;DataTable&lt;/code&gt; vorliegen hat, z.B. bei einer manuell gefüllten Tabelle, und diese nun sortieren will? Die Klasse &lt;code&gt;DataTable&lt;/code&gt; selber stellt keine Funktion zur Sortierung zur Verfügung.&lt;/p&gt;

	&lt;p&gt;Man kann den Umweg über ein &lt;code&gt;DataView&lt;/code&gt; nehmen. Ein &lt;code&gt;DataView&lt;/code&gt; kann man nach jeder beliebigen Spalte sortieren lassen.&lt;/p&gt;

&lt;pre&gt;DataView view = new DataView( table );
view.Sort = &amp;#34;[Spaltenname]&amp;#34;;
table     = view.ToTable();
&lt;/pre&gt;

	&lt;p&gt;Beispiel:&lt;/p&gt;

&lt;pre&gt;DataTable table = new DataTable();

table.Columns.Add( new DataColumn( &amp;#34;Nachname&amp;#34;, typeof( string )));
table.Columns.Add( new DataColumn( &amp;#34;Vorname&amp;#34;, typeof( string )));

table.Rows.Add( new object[] { &amp;#34;de Burgh&amp;#34;, &amp;#34;Chris&amp;#34; } );
table.Rows.Add( new object[] { &amp;#34;Minogue&amp;#34;, &amp;#34;Kylie&amp;#34; } );
table.Rows.Add( new object[] { &amp;#34;Oldfield&amp;#34;, &amp;#34;Mike&amp;#34; } );
table.Rows.Add( new object[] { &amp;#34;Brightman&amp;#34;, &amp;#34;Sarah&amp;#34; } );

DataView view = new DataView( table );
view.Sort = &amp;#34;Nachname&amp;#34;;
table     = view.ToTable();
&lt;/pre&gt;

	&lt;p&gt;Als Werte für den Property &lt;code&gt;Sort&lt;/code&gt; kann man auch mehere Spalten oder sogar die Sortierrichtung angeben, so wie man es vom Sort-Syntax bei &lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt; gewohnt ist:&lt;/p&gt;

&lt;pre&gt;view.Sort = &amp;#34;Nachname, Vorname&amp;#34;;
view.Sort = &amp;#34;Nachname DESC&amp;#34;;
view.Sort = &amp;#34;Nachname DESC, Vorname&amp;#34;; 
&lt;/pre&gt; 
    </content:encoded>

    <pubDate>Mon, 11 Jul 2011 21:01:42 +0200</pubDate>
    <guid isPermaLink="false">http://www.gueggel.de/blog/eintrag/2011-07-11-1116.html</guid>
    <category>DataTable</category>
<category>DataView</category>

</item>
<item>
    <title>Mehrfachen Start eines Programmes verhindern</title>
    <link>http://www.gueggel.de/blog/eintrag/2011-07-11-Mehrfachen-Start-eines-Programmes-verhindern.html</link>
            <category>C-Sharp</category>
    
    <comments>http://www.gueggel.de/blog/eintrag/2011-07-11-Mehrfachen-Start-eines-Programmes-verhindern.html#comments</comments>
    <wfw:comment>http://www.gueggel.de/blog/wfwcomment.php?cid=1115</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.gueggel.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1115</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Je nach Art des Programmes ist es unerwünscht bzw. kann sogar zu Fehlern oder Nebenwirkungen führen wenn man dieses mehrmals startet. Wie aber nun herausfinden ob das eigene Programm schon läuft?&lt;/p&gt;

	&lt;p&gt;Dafür kann man sich die &lt;code&gt;Mutex&lt;/code&gt;-Klasse aus &lt;code&gt;System.Threading&lt;/code&gt; zu nutze machen.&lt;/p&gt;

&lt;pre&gt;using System;
using System.Threading;

class Program
{
    private static Mutex mutex;

    public static void Main( string[] args )
    {
        // Falls Programm schon laeuft neuen Start verhindern.
        if ( IsRunning() ) return;

        Console.WriteLine( &amp;#34;Hello World&amp;#34; );
        Console.ReadLine();
    }


    /// &amp;#60;summary&amp;#62;
    /// Pruefen ob Programm schon laueft.
    /// &amp;#60;/summary&amp;#62;
    /// &amp;#60;returns&amp;#62;True = Programm laeuft schon&amp;#60;/returns&amp;#62;
    public static bool IsRunning() {
        // Eindeutige Programmkennung erzeugen
        mutex = new Mutex( false, System.Reflection.Assembly.GetExecutingAssembly().GetName().Name+&amp;#34;_MultiStartPrevent&amp;#34; );
		
        if ( mutex.WaitOne( 0, true ) ) return false;
        return true;
    }
}
 
&lt;/pre&gt; 
    </content:encoded>

    <pubDate>Mon, 11 Jul 2011 20:29:22 +0200</pubDate>
    <guid isPermaLink="false">http://www.gueggel.de/blog/eintrag/2011-07-11-1115.html</guid>
    <category>Threading</category>

</item>
<item>
    <title>LINQ-Abfrage in DataTable umwandeln</title>
    <link>http://www.gueggel.de/blog/eintrag/2011-07-06-LINQ-Abfrage-in-DataTable-umwandeln.html</link>
            <category>C-Sharp</category>
    
    <comments>http://www.gueggel.de/blog/eintrag/2011-07-06-LINQ-Abfrage-in-DataTable-umwandeln.html#comments</comments>
    <wfw:comment>http://www.gueggel.de/blog/wfwcomment.php?cid=1114</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.gueggel.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1114</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Seit C# 3.0 kann man ja via &lt;span class=&quot;caps&quot;&gt;LINQ&lt;/span&gt; eine Datenbank abfragen. Eine schöne Sache. Ab und zu, für bestimmte Zwecke, benötigt man aber immer noch die Ergebnisse als klassische &lt;code&gt;DataTable&lt;/code&gt;. Wie wandelt man nun das Ergebnis einer LINQ-Abfrage in eine &lt;code&gt;DataTable&lt;/code&gt; um?&lt;/p&gt;

	&lt;p&gt;Hier die LINQ-Abfrage die mir mein Adressbuch ausliest:&lt;/p&gt;

&lt;pre&gt;DataContext context = new DataContext();
var query = from s in context.Personen
            orderby s.Nachname
            select s;
&lt;/pre&gt;

	&lt;p&gt;Die Datensätze hat man nun in &lt;code&gt;query&lt;/code&gt;. Man könnte jetzt nun mit foreach jeden einzelnen Datensatz abfragen und in eine &lt;code&gt;DataTable&lt;/code&gt; ablegen. Es geht aber noch etwas einfacher:&lt;/p&gt;

&lt;pre&gt;using System;
using System.Data;
using System.Data.SqlClient;
using System.Linq;

/// &amp;#60;summary&amp;#62;
/// Ergebnis einer LINQ-Abfrage in eine DataTable umwandeln.
/// &amp;#60;/summary&amp;#62;
/// &amp;#60;param name=&amp;#34;query&amp;#34;&amp;#62;Abfrageergebnis&amp;#60;/param&amp;#62;
/// &amp;#60;param name=&amp;#34;context&amp;#34;&amp;#62;Context&amp;#60;/param&amp;#62;
/// &amp;#60;returns&amp;#62;Tabelle&amp;#60;/returns&amp;#62;
public DataTable ConvertLinqToDatatable( IQueryable query, DataContext context )
{
    DataTable table = null;
    IDbCommand cmd = null;
    SqlDataAdapter adapter = null;

    try
    {
        // LINQ-Abfrage in Tabelle speichern
        cmd = context.GetCommand( query );
        adapter = new SqlDataAdapter();
        adapter.SelectCommand = (SqlCommand)cmd;
        table = new DataTable();

        cmd.Connection.Open();
        adapter.FillSchema( table, SchemaType.Source );
        adapter.Fill( table );

        return table;
    }
    catch
    {
        throw;
    }
    finally
    {
        if ( table != null ) table.Dispose();
        if ( adapter != null ) adapter.Dispose();

        if ( cmd != null )
        {
            cmd.Connection.Close();
            cmd.Dispose();
        }
    }
}
&lt;/pre&gt;

	&lt;p&gt;Somit einfach wie gewohnt eine LINQ-Abfrage durchführen und dann das Ergbnis mit der Funktion &lt;code&gt;ConvertLinqToDatatable()&lt;/code&gt; umwandeln lassen:&lt;/p&gt;

&lt;pre&gt;DataContext context = new DataContext();
var query = from s in context.Personen
            orderby s.Nachname
            select s;

DataTable = ConvertLinqToDatatable( query, context ); 
&lt;/pre&gt; 
    </content:encoded>

    <pubDate>Wed, 06 Jul 2011 22:23:02 +0200</pubDate>
    <guid isPermaLink="false">http://www.gueggel.de/blog/eintrag/2011-07-06-1114.html</guid>
    <category>DataTable</category>
<category>Linq</category>

</item>

</channel>
</rss>
