<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:georss="http://www.georss.org/georss" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>HP's Blog</title>
    <link>http://blog.schelian.de/</link>
    <description>Hans-Peter Schelian's Weblog</description>
    <language>de-DE</language>
    <copyright>Hans-Peter Schelian - Schelian IT Beratung</copyright>
    <lastBuildDate>Sun, 28 Feb 2010 11:22:40 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>blog@schelian.de</managingEditor>
    <webMaster>blog@schelian.de</webMaster>
    <item>
      <trackback:ping>http://blog.schelian.de/Trackback.aspx?guid=6d5fd6f6-8bc6-4787-a165-7dd91ff02b2b</trackback:ping>
      <pingback:server>http://blog.schelian.de/pingback.aspx</pingback:server>
      <pingback:target>http://blog.schelian.de/PermaLink,guid,6d5fd6f6-8bc6-4787-a165-7dd91ff02b2b.aspx</pingback:target>
      <dc:creator>Hans-Peter Schelian</dc:creator>
      <georss:point>49.749137 8.109198</georss:point>
      <wfw:comment>http://blog.schelian.de/CommentView,guid,6d5fd6f6-8bc6-4787-a165-7dd91ff02b2b.aspx</wfw:comment>
      <wfw:commentRss>http://blog.schelian.de/SyndicationService.asmx/GetEntryCommentsRss?guid=6d5fd6f6-8bc6-4787-a165-7dd91ff02b2b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Ich habe viele Links zu diesem Thema gefunden, aber leider war keiner dabei der mir
wirklich in einem Artikel dazu verholfen hat SpamAssassin in eine hMailServer Installation
zu integrieren. Mit ein wenig Recherche und dem guten alten “Try and Error Verfahren”
habe ich eine einfache Möglichkeit gefunden SpamAssassin zusammen mit dem hMailServer
zu verwenden.
</p>
        <p>
Dieser Beitrag basiert auf den folgend aufgeführten Versionen der Produkte:
</p>
        <ul>
          <li>
Windows Server 2003 R2 Standard (Sorry kein Download, der muss gekauft werden :-))</li>
          <li>
            <a href="http://www.hmailserver.com/index.php?page=download" target="_blank">hMailServer
Version hMailServer 5.3.2 - Build 1769</a> (sollte schon installiert sein)</li>
          <li>
            <a href="http://prdownloads.sourceforge.net/sawin32/SpamAssassin-3.2.3.5-win32.zip?download" target="_blank">SpamAssassin
for Win32 command-line tools Version 3.2.3.5</a> (wird benötigt bitte Herunterladen)</li>
          <li>
            <a href="http://prdownloads.sourceforge.net/sawin32/sa-update-3.2.3.3.zip?download" target="_blank">sa-update
Version 3.2.3.3</a> (wird benötigt bitte Herunterladen)</li>
          <li>
            <a href="http://www.pirmasoft.com/runassvc.php" target="_blank">RunAsSvc.exe Version
1.6.159.59</a> (wird benötigt bitte Herunterladen)</li>
        </ul>
        <p>
Und nun zur Schritt für Schritt Anleitung zur Einrichtung von SpamAssassin zusammen
mit dem hMailServer:
</p>
        <p>
          <strong>
            <u>1) Herunterladen aller benötigten Programme / Tools.</u>
          </strong>
        </p>
        <p>
Siehe oben (SpamAssassin command-line-tools, sa-update ebenfalls ein SpamAssassin
Tool und ein Hilfsprogramm um den SpamAssassin Deamon als Dienst unter Windows betreiben
zu können.
</p>
        <p>
          <strong>
            <u>2) Verzeichnisse erstellen</u>
          </strong>
        </p>
        <p>
Wir erstellen 2 Verzeichnisse. das eine für SpamAssassin (z.B. D:\SA) das zweite für
unser Tool RunAsSvc (z.B. D:\runassvc)
</p>
        <p>
          <strong>
            <u>3) ZIP Archive auspacken</u>
          </strong>
        </p>
        <p>
Die beiden SpamAssassin ZIP Archive kopieren wir in das Verzeichnis D:\SA und dort
entpacken wir beide Archive, dabei können wir ruhig nach Aufforderung die Datei ssleay32.dll
überschreiben, da sie in beiden Paketen in der gleichen Version enthalten ist.
</p>
        <p>
Das Archiv mit dem RunAsScv Hilfsprogramm kopieren wir in das Verzeichnis D:\runasscv
und entpacken den Inhalt in diesem Verzeichnis.
</p>
        <p>
          <strong>
            <u>4) Registry Eintrag erstellen</u>
          </strong>
        </p>
        <p>
Um von SpamAssassin eine Logdatei erstellt zu bekommen müssen wir bevor wir den Dienst
einrichten einen Eintrag in die Registry hinzufügen.
</p>
        <p>
Hierzu öffnen wir regedit und erzeugen unter dem Registry Schlüssel
</p>
        <p>
          <strong>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\</strong>
        </p>
        <p>
einen neuen Schlüssel mit dem Namen SPAMASSASSIN (oder jeder andere Name, jedoch ist
darauf zu achten, dass dieser Name auch beim einrichten des Dienstes verwendet wird).
</p>
        <p>
Unter diesem neuen Schlüssel: 
</p>
        <p>
          <strong>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SPAMASSASSIN</strong>
        </p>
        <p>
legen wir nun eine Neue Zeichenfolge mit dem Namen Application und dem nachfolgenden
Inhalt an:
</p>
        <p>
d:\sa\spamd.exe -l -s d:\sa\spamd.log --round-robin
</p>
        <p>
          <strong>
            <u>5) Dienst installieren</u>
          </strong>
        </p>
        <p>
Nun wechseln wir in das Verzeichnis d:\runasscv und starten dort das Programm RunAsSvc.Exe
und füllen das sich öffnende Dialog wie nachstehend abgebildet:
</p>
        <p>
 <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/hMailSpamAssassinIntegrationinhMailServe_A82B/image_6.png" width="430" height="258" /></p>
        <p>
Der Dienst wird nachdem wir unsere Eingaben mit OK bestätigt haben installiert und
sofort gestartet.
</p>
        <p>
Eigentlich war das bis auf die Aktivierung des SpamAssassin in hMailServer alles.
</p>
        <p>
Was noch bleibt ist die Aktualisierung des SpamAssassin einzurichten, entweder als
geplanten Task oder einem anderen Tool welches Zeitgesteuert Programme ausführen kann.
</p>
        <p>
Der Aufruf zum Update lautet wie folgt:
</p>
        <p>
D:\SA\sa-update.exe --nogpg
</p>
        <p>
        </p>
        <p>
-- Hoffe das hilft jemandem weiter --
</p>
        <img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=6d5fd6f6-8bc6-4787-a165-7dd91ff02b2b" />
      </body>
      <title>hMail - SpamAssassin Integration in hMailServer</title>
      <guid isPermaLink="false">http://blog.schelian.de/PermaLink,guid,6d5fd6f6-8bc6-4787-a165-7dd91ff02b2b.aspx</guid>
      <link>http://blog.schelian.de/2010/02/28/hMailSpamAssassinIntegrationInHMailServer.aspx</link>
      <pubDate>Sun, 28 Feb 2010 11:22:40 GMT</pubDate>
      <description>&lt;p&gt;
Ich habe viele Links zu diesem Thema gefunden, aber leider war keiner dabei der mir
wirklich in einem Artikel dazu verholfen hat SpamAssassin in eine hMailServer Installation
zu integrieren. Mit ein wenig Recherche und dem guten alten “Try and Error Verfahren”
habe ich eine einfache Möglichkeit gefunden SpamAssassin zusammen mit dem hMailServer
zu verwenden.
&lt;/p&gt;
&lt;p&gt;
Dieser Beitrag basiert auf den folgend aufgeführten Versionen der Produkte:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Windows Server 2003 R2 Standard (Sorry kein Download, der muss gekauft werden :-))&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.hmailserver.com/index.php?page=download" target="_blank"&gt;hMailServer
Version hMailServer 5.3.2 - Build 1769&lt;/a&gt; (sollte schon installiert sein)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://prdownloads.sourceforge.net/sawin32/SpamAssassin-3.2.3.5-win32.zip?download" target="_blank"&gt;SpamAssassin
for Win32 command-line tools Version 3.2.3.5&lt;/a&gt; (wird benötigt bitte Herunterladen)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://prdownloads.sourceforge.net/sawin32/sa-update-3.2.3.3.zip?download" target="_blank"&gt;sa-update
Version 3.2.3.3&lt;/a&gt; (wird benötigt bitte Herunterladen)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pirmasoft.com/runassvc.php" target="_blank"&gt;RunAsSvc.exe Version
1.6.159.59&lt;/a&gt; (wird benötigt bitte Herunterladen)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Und nun zur Schritt für Schritt Anleitung zur Einrichtung von SpamAssassin zusammen
mit dem hMailServer:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;1) Herunterladen aller benötigten Programme / Tools.&lt;/u&gt;&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
Siehe oben (SpamAssassin command-line-tools, sa-update ebenfalls ein SpamAssassin
Tool und ein Hilfsprogramm um den SpamAssassin Deamon als Dienst unter Windows betreiben
zu können.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;2) Verzeichnisse erstellen&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Wir erstellen 2 Verzeichnisse. das eine für SpamAssassin (z.B. D:\SA) das zweite für
unser Tool RunAsSvc (z.B. D:\runassvc)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;3) ZIP Archive auspacken&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Die beiden SpamAssassin ZIP Archive kopieren wir in das Verzeichnis D:\SA und dort
entpacken wir beide Archive, dabei können wir ruhig nach Aufforderung die Datei ssleay32.dll
überschreiben, da sie in beiden Paketen in der gleichen Version enthalten ist.
&lt;/p&gt;
&lt;p&gt;
Das Archiv mit dem RunAsScv Hilfsprogramm kopieren wir in das Verzeichnis D:\runasscv
und entpacken den Inhalt in diesem Verzeichnis.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;4) Registry Eintrag erstellen&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Um von SpamAssassin eine Logdatei erstellt zu bekommen müssen wir bevor wir den Dienst
einrichten einen Eintrag in die Registry hinzufügen.
&lt;/p&gt;
&lt;p&gt;
Hierzu öffnen wir regedit und erzeugen unter dem Registry Schlüssel
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
einen neuen Schlüssel mit dem Namen SPAMASSASSIN (oder jeder andere Name, jedoch ist
darauf zu achten, dass dieser Name auch beim einrichten des Dienstes verwendet wird).
&lt;/p&gt;
&lt;p&gt;
Unter diesem neuen Schlüssel: 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SPAMASSASSIN&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
legen wir nun eine Neue Zeichenfolge mit dem Namen Application und dem nachfolgenden
Inhalt an:
&lt;/p&gt;
&lt;p&gt;
d:\sa\spamd.exe -l -s d:\sa\spamd.log --round-robin
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;5) Dienst installieren&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Nun wechseln wir in das Verzeichnis d:\runasscv und starten dort das Programm RunAsSvc.Exe
und füllen das sich öffnende Dialog wie nachstehend abgebildet:
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/hMailSpamAssassinIntegrationinhMailServe_A82B/image_6.png" width="430" height="258"&gt; 
&lt;/p&gt;
&lt;p&gt;
Der Dienst wird nachdem wir unsere Eingaben mit OK bestätigt haben installiert und
sofort gestartet.
&lt;/p&gt;
&lt;p&gt;
Eigentlich war das bis auf die Aktivierung des SpamAssassin in hMailServer alles.
&lt;/p&gt;
&lt;p&gt;
Was noch bleibt ist die Aktualisierung des SpamAssassin einzurichten, entweder als
geplanten Task oder einem anderen Tool welches Zeitgesteuert Programme ausführen kann.
&lt;/p&gt;
&lt;p&gt;
Der Aufruf zum Update lautet wie folgt:
&lt;/p&gt;
&lt;p&gt;
D:\SA\sa-update.exe --nogpg
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
-- Hoffe das hilft jemandem weiter --
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=6d5fd6f6-8bc6-4787-a165-7dd91ff02b2b" /&gt;</description>
      <comments>http://blog.schelian.de/CommentView,guid,6d5fd6f6-8bc6-4787-a165-7dd91ff02b2b.aspx</comments>
      <category>Allgemein/Tips und Tricks</category>
      <category>Server</category>
    </item>
    <item>
      <trackback:ping>http://blog.schelian.de/Trackback.aspx?guid=1f785f95-d0f2-4edb-801e-df59c7a69c57</trackback:ping>
      <pingback:server>http://blog.schelian.de/pingback.aspx</pingback:server>
      <pingback:target>http://blog.schelian.de/PermaLink,guid,1f785f95-d0f2-4edb-801e-df59c7a69c57.aspx</pingback:target>
      <dc:creator>Hans-Peter Schelian</dc:creator>
      <georss:point>49.749137 8.109198</georss:point>
      <wfw:comment>http://blog.schelian.de/CommentView,guid,1f785f95-d0f2-4edb-801e-df59c7a69c57.aspx</wfw:comment>
      <wfw:commentRss>http://blog.schelian.de/SyndicationService.asmx/GetEntryCommentsRss?guid=1f785f95-d0f2-4edb-801e-df59c7a69c57</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Abfragen, in meinem Fall einige Views, haben plötzlich anstatt Sekundenbruchteile,
Minuten gebraucht um ein Ergebnis zurückzugeben.<br />
Das merkwürdigste aber daran war, wenn ich eine Datenbanksicherung auf einem anderen
Server (sehr viel kleineren Server) zurückgespielt habe wurden die Abfragen wie gewohnt
schnell ausgeführt.
</p>
        <p>
Also lag die Vermutung nahe, dass es an diesem Server liegen muss und somit habe ich
folgendes Versucht:
</p>
        <ul>
          <li>
Ein Neustart des SQL Server (auch den ganzen Servers) – Kein Erfolg. :-( 
</li>
          <li>
Festplatte des Server defragmentiert (Natürlich vorher den SQL Server Dienst beendet,
damit die Datenbankdateien selbst defragmentiert werden konnten) – Kein Erfolg :-( 
</li>
          <li>
Gesamt Konfiguration des Server mit einem Server der schnellere Ergebnisse geliefert
hat verglichen (Alles OK) – Kein Erfolg :-( 
</li>
          <li>
SQL Profiler … Nein das ist Unsinn, denn die DB (also das Backup auf einem anderen
Server läuft ja bestens) – Also Arbeit gespart :-)</li>
        </ul>
        <p>
Und dann bin ich auf <a href="http://msdn.microsoft.com/de-de/library/ms177500.aspx" target="_blank">diese
Seite</a> gestoßen und dabei auch auf den alles Entscheidenden Hinweis; die Statistiken.
</p>
        <p>
Ein Aufruf der Gespeicherten Prozedur <a href="http://msdn.microsoft.com/de-de/library/ms173804.aspx" target="_blank">sp_updatestats</a> hat
dann den gewünschten Erfolg gehabt. 
</p>
        <p>
Die Abfragen geben nun wieder wie gewohnt schnelle Ergebnisse zurück.
</p>
        <p>
Und falls ich damit niemand anderem helfen kann, so doch sicherlich mir selbst, wenn
in einigen Monaten bei einer anderen Datenbank ein ähnliches Problem ansteht und ich
dies hier schon wieder vergessen habe, und dann über meinen eigenen Blog Beitrag stolpere.
</p>
        <img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=1f785f95-d0f2-4edb-801e-df59c7a69c57" />
      </body>
      <title>MS SQL Server – SQL Abfragen langsam (Sehr Langsam - dauern mehrere Minuten statt Sekundenbruchteilen)</title>
      <guid isPermaLink="false">http://blog.schelian.de/PermaLink,guid,1f785f95-d0f2-4edb-801e-df59c7a69c57.aspx</guid>
      <link>http://blog.schelian.de/2010/02/27/MSSQLServerSQLAbfragenLangsamSehrLangsamDauernMehrereMinutenStattSekundenbruchteilen.aspx</link>
      <pubDate>Sat, 27 Feb 2010 10:01:08 GMT</pubDate>
      <description>&lt;p&gt;
Abfragen, in meinem Fall einige Views, haben plötzlich anstatt Sekundenbruchteile,
Minuten gebraucht um ein Ergebnis zurückzugeben.&lt;br&gt;
Das merkwürdigste aber daran war, wenn ich eine Datenbanksicherung auf einem anderen
Server (sehr viel kleineren Server) zurückgespielt habe wurden die Abfragen wie gewohnt
schnell ausgeführt.
&lt;/p&gt;
&lt;p&gt;
Also lag die Vermutung nahe, dass es an diesem Server liegen muss und somit habe ich
folgendes Versucht:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Ein Neustart des SQL Server (auch den ganzen Servers) – Kein Erfolg. :-( 
&lt;li&gt;
Festplatte des Server defragmentiert (Natürlich vorher den SQL Server Dienst beendet,
damit die Datenbankdateien selbst defragmentiert werden konnten) – Kein Erfolg :-( 
&lt;li&gt;
Gesamt Konfiguration des Server mit einem Server der schnellere Ergebnisse geliefert
hat verglichen (Alles OK) – Kein Erfolg :-( 
&lt;li&gt;
SQL Profiler … Nein das ist Unsinn, denn die DB (also das Backup auf einem anderen
Server läuft ja bestens) – Also Arbeit gespart :-)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Und dann bin ich auf &lt;a href="http://msdn.microsoft.com/de-de/library/ms177500.aspx" target="_blank"&gt;diese
Seite&lt;/a&gt; gestoßen und dabei auch auf den alles Entscheidenden Hinweis; die Statistiken.
&lt;/p&gt;
&lt;p&gt;
Ein Aufruf der Gespeicherten Prozedur &lt;a href="http://msdn.microsoft.com/de-de/library/ms173804.aspx" target="_blank"&gt;sp_updatestats&lt;/a&gt; hat
dann den gewünschten Erfolg gehabt. 
&lt;/p&gt;
&lt;p&gt;
Die Abfragen geben nun wieder wie gewohnt schnelle Ergebnisse zurück.
&lt;/p&gt;
&lt;p&gt;
Und falls ich damit niemand anderem helfen kann, so doch sicherlich mir selbst, wenn
in einigen Monaten bei einer anderen Datenbank ein ähnliches Problem ansteht und ich
dies hier schon wieder vergessen habe, und dann über meinen eigenen Blog Beitrag stolpere.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=1f785f95-d0f2-4edb-801e-df59c7a69c57" /&gt;</description>
      <comments>http://blog.schelian.de/CommentView,guid,1f785f95-d0f2-4edb-801e-df59c7a69c57.aspx</comments>
      <category>Allgemein/Tips und Tricks</category>
      <category>Server</category>
      <category>Server/SQL Server</category>
    </item>
    <item>
      <trackback:ping>http://blog.schelian.de/Trackback.aspx?guid=9187c2b8-2048-41f3-ada3-84c8b7c727b6</trackback:ping>
      <pingback:server>http://blog.schelian.de/pingback.aspx</pingback:server>
      <pingback:target>http://blog.schelian.de/PermaLink,guid,9187c2b8-2048-41f3-ada3-84c8b7c727b6.aspx</pingback:target>
      <dc:creator>Hans-Peter Schelian</dc:creator>
      <georss:point>49.749137 8.109198</georss:point>
      <wfw:comment>http://blog.schelian.de/CommentView,guid,9187c2b8-2048-41f3-ada3-84c8b7c727b6.aspx</wfw:comment>
      <wfw:commentRss>http://blog.schelian.de/SyndicationService.asmx/GetEntryCommentsRss?guid=9187c2b8-2048-41f3-ada3-84c8b7c727b6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Bei der Einrichtung des FileZilla FTP Server auf einem Windows Server (2003 oder 2008)
kommt es immer wieder zu dem Problem, dass trotz scheinbar richtig eingerichteter
Windows Firewall bei Verbindungsaufbau zum FTP Server folgender Fehler im FTP Client
angezeigt wird:
</p>
        <p>
Befehl:    MLSD<br />
Antwort:    425 Can't open data connection.<br />
Fehler:    Verzeichnisinhalt konnte nicht empfangen werden 
</p>
        <p>
 
</p>
        <p>
Zuerst aber einmal die Information was mit scheinbar richtig eingerichteter Firewall
gemeint ist:
</p>
        <p>
Auf der Registerkarte “Ausnahmen” der Firewall Einstellungen gibt es den Eintrag “FTP-Server”
und dieser wird auch meistens richtigerweise aktiviert, so dass der Port 21 über das
Netzwerk (LAN, WAN, Internet) erreichbar ist.
</p>
        <p>
          <a href="http://blog.schelian.de/content/binary/WindowsLiveWriter/FileZillaFTPServermlsd425cantopendatacon_6DE0/image_2.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/FileZillaFTPServermlsd425cantopendatacon_6DE0/image_thumb.png" width="209" height="244" />
          </a>
        </p>
        <p>
Wenn man aber nun mit einem FTP Client versucht eine Verbindung herzustellen, dann
kommt eben der weiter oben beschriebene Fehler.
</p>
        <p>
Das Problem liegt daran, dass man zusätzlich zur Freigabe des Port 21 (FTP-Server)
auch noch den FTP-Server Dienst freigeben muss damit der Zugriff auf den FTP Server
funktioniert.
</p>
        <p>
Hierzu ist noch folgendes Einzustellen:
</p>
        <p>
Register “Erweitert” und dort Einstellungen:
</p>
        <p>
          <a href="http://blog.schelian.de/content/binary/WindowsLiveWriter/FileZillaFTPServermlsd425cantopendatacon_6DE0/image_4.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/FileZillaFTPServermlsd425cantopendatacon_6DE0/image_thumb_1.png" width="210" height="244" />
          </a>
        </p>
        <p>
In den Erweiterten Einstellungen ist dann noch der FTP-Server Dienst zu aktivieren.
</p>
        <p>
          <a href="http://blog.schelian.de/content/binary/WindowsLiveWriter/FileZillaFTPServermlsd425cantopendatacon_6DE0/image_6.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/FileZillaFTPServermlsd425cantopendatacon_6DE0/image_thumb_2.png" width="202" height="244" />
          </a>
        </p>
        <p>
Mit diesen Einstellungen sollte es dann funktionieren.
</p>
        <img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=9187c2b8-2048-41f3-ada3-84c8b7c727b6" />
      </body>
      <title>FileZilla FTP Server - mlsd 425 can't open data connection</title>
      <guid isPermaLink="false">http://blog.schelian.de/PermaLink,guid,9187c2b8-2048-41f3-ada3-84c8b7c727b6.aspx</guid>
      <link>http://blog.schelian.de/2010/01/13/FileZillaFTPServerMlsd425CantOpenDataConnection.aspx</link>
      <pubDate>Wed, 13 Jan 2010 05:48:00 GMT</pubDate>
      <description>&lt;p&gt;
Bei der Einrichtung des FileZilla FTP Server auf einem Windows Server (2003 oder 2008)
kommt es immer wieder zu dem Problem, dass trotz scheinbar richtig eingerichteter
Windows Firewall bei Verbindungsaufbau zum FTP Server folgender Fehler im FTP Client
angezeigt wird:
&lt;/p&gt;
&lt;p&gt;
Befehl:&amp;nbsp;&amp;nbsp;&amp;nbsp; MLSD&lt;br&gt;
Antwort:&amp;nbsp;&amp;nbsp;&amp;nbsp; 425 Can't open data connection.&lt;br&gt;
Fehler:&amp;nbsp;&amp;nbsp;&amp;nbsp; Verzeichnisinhalt konnte nicht empfangen werden 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Zuerst aber einmal die Information was mit scheinbar richtig eingerichteter Firewall
gemeint ist:
&lt;/p&gt;
&lt;p&gt;
Auf der Registerkarte “Ausnahmen” der Firewall Einstellungen gibt es den Eintrag “FTP-Server”
und dieser wird auch meistens richtigerweise aktiviert, so dass der Port 21 über das
Netzwerk (LAN, WAN, Internet) erreichbar ist.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.schelian.de/content/binary/WindowsLiveWriter/FileZillaFTPServermlsd425cantopendatacon_6DE0/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/FileZillaFTPServermlsd425cantopendatacon_6DE0/image_thumb.png" width="209" height="244"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Wenn man aber nun mit einem FTP Client versucht eine Verbindung herzustellen, dann
kommt eben der weiter oben beschriebene Fehler.
&lt;/p&gt;
&lt;p&gt;
Das Problem liegt daran, dass man zusätzlich zur Freigabe des Port 21 (FTP-Server)
auch noch den FTP-Server Dienst freigeben muss damit der Zugriff auf den FTP Server
funktioniert.
&lt;/p&gt;
&lt;p&gt;
Hierzu ist noch folgendes Einzustellen:
&lt;/p&gt;
&lt;p&gt;
Register “Erweitert” und dort Einstellungen:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.schelian.de/content/binary/WindowsLiveWriter/FileZillaFTPServermlsd425cantopendatacon_6DE0/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/FileZillaFTPServermlsd425cantopendatacon_6DE0/image_thumb_1.png" width="210" height="244"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
In den Erweiterten Einstellungen ist dann noch der FTP-Server Dienst zu aktivieren.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.schelian.de/content/binary/WindowsLiveWriter/FileZillaFTPServermlsd425cantopendatacon_6DE0/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/FileZillaFTPServermlsd425cantopendatacon_6DE0/image_thumb_2.png" width="202" height="244"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Mit diesen Einstellungen sollte es dann funktionieren.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=9187c2b8-2048-41f3-ada3-84c8b7c727b6" /&gt;</description>
      <comments>http://blog.schelian.de/CommentView,guid,9187c2b8-2048-41f3-ada3-84c8b7c727b6.aspx</comments>
      <category>Allgemein/Tips und Tricks</category>
      <category>Open Source/FileZilla</category>
    </item>
    <item>
      <trackback:ping>http://blog.schelian.de/Trackback.aspx?guid=6e23104c-efc8-437b-a3c8-e998c50c430d</trackback:ping>
      <pingback:server>http://blog.schelian.de/pingback.aspx</pingback:server>
      <pingback:target>http://blog.schelian.de/PermaLink,guid,6e23104c-efc8-437b-a3c8-e998c50c430d.aspx</pingback:target>
      <dc:creator>Hans-Peter Schelian</dc:creator>
      <georss:point>49.749137 8.109198</georss:point>
      <wfw:comment>http://blog.schelian.de/CommentView,guid,6e23104c-efc8-437b-a3c8-e998c50c430d.aspx</wfw:comment>
      <wfw:commentRss>http://blog.schelian.de/SyndicationService.asmx/GetEntryCommentsRss?guid=6e23104c-efc8-437b-a3c8-e998c50c430d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Vor kurzem wurde im Zuge eines Projektes  (Unterstützung eines Entwickler Teams
für eine Winform Anwendung im Logistikumfeld) unter anderem die Anforderung an mich
heran getragen, dass der Kunde die Ansprechpartner für eine bestimmte Logistische
Aktivität aus einer Combobox auswählen möchte. 
</p>
        <p>
Hierbei sollte in der Combobox, nicht nur ein Feld aus der Datenbank angezeigt werden,
sondern die Anzeige sollte aus insgesamt 2 Feldern zusammengebaut werden.
</p>
        <p>
Das Format sollte so aussehen: Nachname, Vorname 
</p>
        <p>
Hier ein Beispiel:
</p>
        <p>
Mustermann, Hans
</p>
        <p>
Dabei sollte die Lösung vollkommen im Client implementiert sein und nicht durch eine
geänderte Abfrage der Datenbank realisiert werden.
</p>
        <p>
Nun ist es aber so, dass man dem DisplayMember nur ein Feld der Datengebundenen Tabelle
(Objekt) zuweisen kann und nicht mehrere oder sogar wie hier gewünscht diese Felder
auch noch in einem bestimmten Format.
</p>
        <p>
Sicherlich könnte man sich ein eigenen Objekt (List Objekt) erzeugen welches man dann
als Datenquelle für die Bindung verwendet, aber es geht auch (viel) einfacher.
</p>
        <p>
Hierzu verwenden wir dem Format Event der Combobox.
</p>
        <p>
Dieser Event bekommt zwei Parameter mit übergeben:
</p>
        <p>
object sender
</p>
        <p>
ListControlConvertEventArgs e
</p>
        <p>
Wobei wir für die hier beschriebene Lösung lediglich den ListControlConvertEventArgs
Parameter benötigen und auch verwenden.
</p>
        <p>
in e.ListItem wird das Datengebundene Objekt übergeben und in e.Value kann man den
gewünschten Wert zurückgeben.
</p>
        <p>
Hier ein zusammenhängendes Beispiel:
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:26e05a48-dc67-4d98-a599-c44372519e49" class="wlWriterEditableSmartContent">
          <pre name="code" class="c#">private void cmbSpediteurKontakt_Format(object sender, ListControlConvertEventArgs e)
{
	// Hier caste ich mir den übergeben Wert in das original Objekt
	var spediteurKontakt = ((SpediteureKontakte) e.ListItem);  
	// Und nun bastele ich mir die gewünschet Anzeige zusammen
	e.Value = String.Format("{0}, {1}", spediteurKontakt.Nachname, spediteurKontakt.Vorname);
}</pre>
        </div>
        <p>
Und das Ergebnis sieht dann so aus:
</p>
        <p>
          <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/CComboBoxAnzeigevonmehrerenDatenfeldernD_DC0C/image_3.png" width="245" height="87" />
        </p>
        <img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=6e23104c-efc8-437b-a3c8-e998c50c430d" />
      </body>
      <title>C# - Combobox Anzeige von mehreren kombinierten Datenfeldern (DisplayMemeber)</title>
      <guid isPermaLink="false">http://blog.schelian.de/PermaLink,guid,6e23104c-efc8-437b-a3c8-e998c50c430d.aspx</guid>
      <link>http://blog.schelian.de/2009/12/30/CComboboxAnzeigeVonMehrerenKombiniertenDatenfeldernDisplayMemeber.aspx</link>
      <pubDate>Wed, 30 Dec 2009 14:07:00 GMT</pubDate>
      <description>&lt;p&gt;
Vor kurzem wurde im Zuge eines Projektes&amp;nbsp; (Unterstützung eines Entwickler Teams
für eine Winform Anwendung im Logistikumfeld) unter anderem die Anforderung an mich
heran getragen, dass der Kunde die Ansprechpartner für eine bestimmte Logistische
Aktivität aus einer Combobox auswählen möchte. 
&lt;/p&gt;
&lt;p&gt;
Hierbei sollte in der Combobox, nicht nur ein Feld aus der Datenbank angezeigt werden,
sondern die Anzeige sollte aus insgesamt 2 Feldern zusammengebaut werden.
&lt;/p&gt;
&lt;p&gt;
Das Format sollte so aussehen: Nachname, Vorname 
&lt;/p&gt;
&lt;p&gt;
Hier ein Beispiel:
&lt;/p&gt;
&lt;p&gt;
Mustermann, Hans
&lt;/p&gt;
&lt;p&gt;
Dabei sollte die Lösung vollkommen im Client implementiert sein und nicht durch eine
geänderte Abfrage der Datenbank realisiert werden.
&lt;/p&gt;
&lt;p&gt;
Nun ist es aber so, dass man dem DisplayMember nur ein Feld der Datengebundenen Tabelle
(Objekt) zuweisen kann und nicht mehrere oder sogar wie hier gewünscht diese Felder
auch noch in einem bestimmten Format.
&lt;/p&gt;
&lt;p&gt;
Sicherlich könnte man sich ein eigenen Objekt (List Objekt) erzeugen welches man dann
als Datenquelle für die Bindung verwendet, aber es geht auch (viel) einfacher.
&lt;/p&gt;
&lt;p&gt;
Hierzu verwenden wir dem Format Event der Combobox.
&lt;/p&gt;
&lt;p&gt;
Dieser Event bekommt zwei Parameter mit übergeben:
&lt;/p&gt;
&lt;p&gt;
object sender
&lt;/p&gt;
&lt;p&gt;
ListControlConvertEventArgs e
&lt;/p&gt;
&lt;p&gt;
Wobei wir für die hier beschriebene Lösung lediglich den ListControlConvertEventArgs
Parameter benötigen und auch verwenden.
&lt;/p&gt;
&lt;p&gt;
in e.ListItem wird das Datengebundene Objekt übergeben und in e.Value kann man den
gewünschten Wert zurückgeben.
&lt;/p&gt;
&lt;p&gt;
Hier ein zusammenhängendes Beispiel:
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:26e05a48-dc67-4d98-a599-c44372519e49" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;private void cmbSpediteurKontakt_Format(object sender, ListControlConvertEventArgs e)
{
	// Hier caste ich mir den übergeben Wert in das original Objekt
	var spediteurKontakt = ((SpediteureKontakte) e.ListItem);  
	// Und nun bastele ich mir die gewünschet Anzeige zusammen
	e.Value = String.Format("{0}, {1}", spediteurKontakt.Nachname, spediteurKontakt.Vorname);
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Und das Ergebnis sieht dann so aus:
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/CComboBoxAnzeigevonmehrerenDatenfeldernD_DC0C/image_3.png" width="245" height="87"&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=6e23104c-efc8-437b-a3c8-e998c50c430d" /&gt;</description>
      <comments>http://blog.schelian.de/CommentView,guid,6e23104c-efc8-437b-a3c8-e998c50c430d.aspx</comments>
      <category>Programmierung/Tips und Tricks</category>
      <category>Sprachen/C#</category>
    </item>
    <item>
      <trackback:ping>http://blog.schelian.de/Trackback.aspx?guid=f5d40eb1-04f9-4dba-ab9b-2a8744ee627a</trackback:ping>
      <pingback:server>http://blog.schelian.de/pingback.aspx</pingback:server>
      <pingback:target>http://blog.schelian.de/PermaLink,guid,f5d40eb1-04f9-4dba-ab9b-2a8744ee627a.aspx</pingback:target>
      <dc:creator>Hans-Peter Schelian</dc:creator>
      <georss:point>49.749137 8.109198</georss:point>
      <wfw:comment>http://blog.schelian.de/CommentView,guid,f5d40eb1-04f9-4dba-ab9b-2a8744ee627a.aspx</wfw:comment>
      <wfw:commentRss>http://blog.schelian.de/SyndicationService.asmx/GetEntryCommentsRss?guid=f5d40eb1-04f9-4dba-ab9b-2a8744ee627a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Seit Heute Morgen ist der erste Release Kandidat der neuen 3.0 Version von Thunderbird
verfügbar.
</p>
        <p>
Einen direkten Link zum herunterladen konnte ich zwar nicht finden, aber wer die Beta
4 auf einem Rechner hat, kann mit dem “Auf Update prüfen” seine Version aktualisieren.
</p>
        <p>
Auf <a href="http://www.thunderbird-mail.de/wiki/Alpha-_und_Beta-Versionen">dieser
Seite</a> finden man die Links zu den Downloads.
</p>
        <img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=f5d40eb1-04f9-4dba-ab9b-2a8744ee627a" />
      </body>
      <title>Thunderbird 3.0 RC1 verfügbar</title>
      <guid isPermaLink="false">http://blog.schelian.de/PermaLink,guid,f5d40eb1-04f9-4dba-ab9b-2a8744ee627a.aspx</guid>
      <link>http://blog.schelian.de/2009/11/25/Thunderbird30RC1Verf%c3%bcgbar.aspx</link>
      <pubDate>Wed, 25 Nov 2009 06:29:08 GMT</pubDate>
      <description>&lt;p&gt;
Seit Heute Morgen ist der erste Release Kandidat der neuen 3.0 Version von Thunderbird
verfügbar.
&lt;/p&gt;
&lt;p&gt;
Einen direkten Link zum herunterladen konnte ich zwar nicht finden, aber wer die Beta
4 auf einem Rechner hat, kann mit dem “Auf Update prüfen” seine Version aktualisieren.
&lt;/p&gt;
&lt;p&gt;
Auf &lt;a href="http://www.thunderbird-mail.de/wiki/Alpha-_und_Beta-Versionen"&gt;dieser
Seite&lt;/a&gt; finden man die Links zu den Downloads.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=f5d40eb1-04f9-4dba-ab9b-2a8744ee627a" /&gt;</description>
      <comments>http://blog.schelian.de/CommentView,guid,f5d40eb1-04f9-4dba-ab9b-2a8744ee627a.aspx</comments>
      <category>Allgemein/Kurz und Bündig</category>
      <category>Open Source/Thunderbird</category>
    </item>
    <item>
      <trackback:ping>http://blog.schelian.de/Trackback.aspx?guid=ab25702f-7555-484f-8c6b-5e3f988facd0</trackback:ping>
      <pingback:server>http://blog.schelian.de/pingback.aspx</pingback:server>
      <pingback:target>http://blog.schelian.de/PermaLink,guid,ab25702f-7555-484f-8c6b-5e3f988facd0.aspx</pingback:target>
      <dc:creator>Hans-Peter Schelian</dc:creator>
      <georss:point>49.749137 8.109198</georss:point>
      <wfw:comment>http://blog.schelian.de/CommentView,guid,ab25702f-7555-484f-8c6b-5e3f988facd0.aspx</wfw:comment>
      <wfw:commentRss>http://blog.schelian.de/SyndicationService.asmx/GetEntryCommentsRss?guid=ab25702f-7555-484f-8c6b-5e3f988facd0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Seit ein paar Wochen habe ich eine Logitech MX 3200 Laser Tastatur / Maus Kombination
im Einsatz.
</p>
        <p>
Außer der störenden Zoomfunktion am linken Rand bin ich auch sehr zufrieden. 
</p>
        <p>
Verzweifelt habe ich nach einer Lösung gesucht diese Zoom Funktion zu deaktivieren
und habe nichts gefunden. 
</p>
        <p>
Heute bin ich dann durch Zufall auf die Lösung gestoßen.
</p>
        <p>
          <a href="http://www.pahlmann.biz/blog/allgemeines/dynamic_zoom_mx_3200_abstellen" target="_blank">Hier
der Link zur Web Seite mit der Lösung</a>
        </p>
        <p>
Besten Dank an Cord-Heinrich Pahlmann
</p>
        <img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=ab25702f-7555-484f-8c6b-5e3f988facd0" />
      </body>
      <title>Logitech MX 3200 Laser – Zoom Funktion abschalten</title>
      <guid isPermaLink="false">http://blog.schelian.de/PermaLink,guid,ab25702f-7555-484f-8c6b-5e3f988facd0.aspx</guid>
      <link>http://blog.schelian.de/2009/10/27/LogitechMX3200LaserZoomFunktionAbschalten.aspx</link>
      <pubDate>Tue, 27 Oct 2009 14:05:00 GMT</pubDate>
      <description>&lt;p&gt;
Seit ein paar Wochen habe ich eine Logitech MX 3200 Laser Tastatur / Maus Kombination
im Einsatz.
&lt;/p&gt;
&lt;p&gt;
Außer der störenden Zoomfunktion am linken Rand bin ich auch sehr zufrieden. 
&lt;/p&gt;
&lt;p&gt;
Verzweifelt habe ich nach einer Lösung gesucht diese Zoom Funktion zu deaktivieren
und habe nichts gefunden. 
&lt;/p&gt;
&lt;p&gt;
Heute bin ich dann durch Zufall auf die Lösung gestoßen.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pahlmann.biz/blog/allgemeines/dynamic_zoom_mx_3200_abstellen" target="_blank"&gt;Hier
der Link zur Web Seite mit der Lösung&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Besten Dank an Cord-Heinrich Pahlmann
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=ab25702f-7555-484f-8c6b-5e3f988facd0" /&gt;</description>
      <comments>http://blog.schelian.de/CommentView,guid,ab25702f-7555-484f-8c6b-5e3f988facd0.aspx</comments>
      <category>Allgemein/Tips und Tricks</category>
    </item>
    <item>
      <trackback:ping>http://blog.schelian.de/Trackback.aspx?guid=5006a582-2a89-49ac-a401-e5ee9df288a3</trackback:ping>
      <pingback:server>http://blog.schelian.de/pingback.aspx</pingback:server>
      <pingback:target>http://blog.schelian.de/PermaLink,guid,5006a582-2a89-49ac-a401-e5ee9df288a3.aspx</pingback:target>
      <dc:creator>Hans-Peter Schelian</dc:creator>
      <georss:point>49.749137 8.109198</georss:point>
      <wfw:comment>http://blog.schelian.de/CommentView,guid,5006a582-2a89-49ac-a401-e5ee9df288a3.aspx</wfw:comment>
      <wfw:commentRss>http://blog.schelian.de/SyndicationService.asmx/GetEntryCommentsRss?guid=5006a582-2a89-49ac-a401-e5ee9df288a3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In einer Windows Anwendung wird in einer Form unter anderem ein (eigentlich sind es
zwei, aber dazu später mehr) DateTimePicker verwendet um Termine einzugeben. 
</p>
        <p>
Da der DateTimePicker nicht gerade komfortabel ist um sowohl Datum als auch Uhrzeiten
einzugeben, wird ein DateTimePicker in der Option DropDownCalender (das ist deaktivierte
Eigenschaft ShowUpDown) eingesetzt um das Datum elegant aus dem DropDownCalender auszuwählen
und ein zweites DateTimePicker Control mit der gesetzen Eigenschaft ShowUpDown und
dem entsprechenden Custom Format HH:mm um nur die Uhrzeit mit den Pfeilen hoch und
runter einstellen zu können.
</p>
        <p>
          <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/CDateTimePickerUpDownfehlendeEigenschaft_CE54/image_3.png" width="279" height="36" />
        </p>
        <p>
Nun ist es aber so, dass man im DateTimePicker keinen Inkrement Wert eingeben kann,
um den die Minuten erhöht bzw vermindert werden wenn man einmal auf den Pfeil hoch
oder runter klickt. Somit wird jeweils um eine Minute hoch oder runter gezählt.
</p>
        <p>
In meinem Fall nun wollte der Kunde aber das Termine nicht Minutengenau sondern immer
auf 15 Minuten (Viertelstunde) Basis, also 00, 15, 30 und 45 erfasst werden können.
</p>
        <p>
Da ich nicht gleich ein eigenen Control entwickeln wollte, habe ich einfach eine kleine
Routine in den Change Event des DateTimePicker eingebaut.
</p>
        <p>
Nachfolgend der Code Ich denke die Routine ist selbsterklärend 
</p>
        <p>
        </p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:05e7f36a-57ea-4362-83ba-cb8f3fcd9881" class="wlWriterEditableSmartContent">
          <pre name="code" class="c#">private void startzeitTimePicker_ValueChanged(object sender, EventArgs e)
{
    DateTimePicker dtp = (DateTimePicker)sender;
    // Wenn nicht Minute nicht 0,15,45 oder 60 dann müssen wir was tun
    if ((((dtp.Value.Minute != 0) &amp;&amp; (dtp.Value.Minute != 15)) &amp;&amp; (dtp.Value.Minute != 30)) &amp;&amp;
        (dtp.Value.Minute != 45))
    {
        // Auch noch einfach, nur 14 Minuten drauf und gut ist
        if ((dtp.Value.Minute == 1) || (dtp.Value.Minute == 16) || (dtp.Value.Minute == 31) || (dtp.Value.Minute == 46))
        {
            dtp.Value = dtp.Value.AddMinutes(14);
        }
        else
        {
            // Zeit wurde heruntergezählt.
            if ((dtp.Value.Minute == 14) || (dtp.Value.Minute == 29) || (dtp.Value.Minute == 44) || (dtp.Value.Minute == 59))
            {
                int x = 14;     // Deshalb auf jeden Fall mal 14 Minuten abziehen,
                if (dtp.Value.Minute == 59)  // und wenn die Minuten auf 59 stehen, dann muss noch eine Stunde (60 minuten) mehr abgezogen werden
                {
                    x += 60;
                }
                dtp.Value = dtp.Value.AddMinutes(-x);
            }
            else // Wert muss manuell eingegeben worden sein, dann runden wir auf die nächst höhere Viertelstunde
            {
                for (int i = 0; i &lt; 15; i++)
                {
                    int x = dtp.Value.Minute + i;
                    if ((x == 15) || (x == 30) || (x == 45) || (x == 60))
                    {
                        dtp.Value = dtp.Value.AddMinutes(i);
                        break;
                    }
                }
            }
        }
    }
}</pre>
        </div>
        <p>
Hoffe das hilft dem einen oder anderen (Oder mir selbst beim nächsten mal wenn ich
vor dem gleichen Problem stehen <img alt="Wink" src="http://messenger.msn.com/MMM2006-04-19_17.00/Resource/emoticons/wink_smile.gif" />)
</p>
        <img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=5006a582-2a89-49ac-a401-e5ee9df288a3" />
      </body>
      <title>C# – DateTimePicker – UpDown – fehlende Eigenschaft Increment nachgebildet</title>
      <guid isPermaLink="false">http://blog.schelian.de/PermaLink,guid,5006a582-2a89-49ac-a401-e5ee9df288a3.aspx</guid>
      <link>http://blog.schelian.de/2009/09/29/CDateTimePickerUpDownFehlendeEigenschaftIncrementNachgebildet.aspx</link>
      <pubDate>Tue, 29 Sep 2009 10:39:00 GMT</pubDate>
      <description>&lt;p&gt;
In einer Windows Anwendung wird in einer Form unter anderem ein (eigentlich sind es
zwei, aber dazu später mehr) DateTimePicker verwendet um Termine einzugeben. 
&lt;/p&gt;
&lt;p&gt;
Da der DateTimePicker nicht gerade komfortabel ist um sowohl Datum als auch Uhrzeiten
einzugeben, wird ein DateTimePicker in der Option DropDownCalender (das ist deaktivierte
Eigenschaft ShowUpDown) eingesetzt um das Datum elegant aus dem DropDownCalender auszuwählen
und ein zweites DateTimePicker Control mit der gesetzen Eigenschaft ShowUpDown und
dem entsprechenden Custom Format HH:mm um nur die Uhrzeit mit den Pfeilen hoch und
runter einstellen zu können.
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/CDateTimePickerUpDownfehlendeEigenschaft_CE54/image_3.png" width="279" height="36"&gt; 
&lt;/p&gt;
&lt;p&gt;
Nun ist es aber so, dass man im DateTimePicker keinen Inkrement Wert eingeben kann,
um den die Minuten erhöht bzw vermindert werden wenn man einmal auf den Pfeil hoch
oder runter klickt. Somit wird jeweils um eine Minute hoch oder runter gezählt.
&lt;/p&gt;
&lt;p&gt;
In meinem Fall nun wollte der Kunde aber das Termine nicht Minutengenau sondern immer
auf 15 Minuten (Viertelstunde) Basis, also 00, 15, 30 und 45 erfasst werden können.
&lt;/p&gt;
&lt;p&gt;
Da ich nicht gleich ein eigenen Control entwickeln wollte, habe ich einfach eine kleine
Routine in den Change Event des DateTimePicker eingebaut.
&lt;/p&gt;
&lt;p&gt;
Nachfolgend der Code Ich denke die Routine ist selbsterklärend 
&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:05e7f36a-57ea-4362-83ba-cb8f3fcd9881" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;private void startzeitTimePicker_ValueChanged(object sender, EventArgs e)
{
    DateTimePicker dtp = (DateTimePicker)sender;
    // Wenn nicht Minute nicht 0,15,45 oder 60 dann müssen wir was tun
    if ((((dtp.Value.Minute != 0) &amp;amp;&amp;amp; (dtp.Value.Minute != 15)) &amp;amp;&amp;amp; (dtp.Value.Minute != 30)) &amp;amp;&amp;amp;
        (dtp.Value.Minute != 45))
    {
        // Auch noch einfach, nur 14 Minuten drauf und gut ist
        if ((dtp.Value.Minute == 1) || (dtp.Value.Minute == 16) || (dtp.Value.Minute == 31) || (dtp.Value.Minute == 46))
        {
            dtp.Value = dtp.Value.AddMinutes(14);
        }
        else
        {
            // Zeit wurde heruntergezählt.
            if ((dtp.Value.Minute == 14) || (dtp.Value.Minute == 29) || (dtp.Value.Minute == 44) || (dtp.Value.Minute == 59))
            {
                int x = 14;     // Deshalb auf jeden Fall mal 14 Minuten abziehen,
                if (dtp.Value.Minute == 59)  // und wenn die Minuten auf 59 stehen, dann muss noch eine Stunde (60 minuten) mehr abgezogen werden
                {
                    x += 60;
                }
                dtp.Value = dtp.Value.AddMinutes(-x);
            }
            else // Wert muss manuell eingegeben worden sein, dann runden wir auf die nächst höhere Viertelstunde
            {
                for (int i = 0; i &amp;lt; 15; i++)
                {
                    int x = dtp.Value.Minute + i;
                    if ((x == 15) || (x == 30) || (x == 45) || (x == 60))
                    {
                        dtp.Value = dtp.Value.AddMinutes(i);
                        break;
                    }
                }
            }
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;
&gt;
&lt;p&gt;
Hoffe das hilft dem einen oder anderen (Oder mir selbst beim nächsten mal wenn ich
vor dem gleichen Problem stehen &lt;img alt="Wink" src="http://messenger.msn.com/MMM2006-04-19_17.00/Resource/emoticons/wink_smile.gif"&gt;)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=5006a582-2a89-49ac-a401-e5ee9df288a3" /&gt;</description>
      <comments>http://blog.schelian.de/CommentView,guid,5006a582-2a89-49ac-a401-e5ee9df288a3.aspx</comments>
      <category>Programmierung/Code</category>
      <category>Programmierung/Tips und Tricks</category>
      <category>Sprachen/C#</category>
    </item>
    <item>
      <trackback:ping>http://blog.schelian.de/Trackback.aspx?guid=1540d036-fe5e-4a60-9bfa-47806956a3af</trackback:ping>
      <pingback:server>http://blog.schelian.de/pingback.aspx</pingback:server>
      <pingback:target>http://blog.schelian.de/PermaLink,guid,1540d036-fe5e-4a60-9bfa-47806956a3af.aspx</pingback:target>
      <dc:creator>Hans-Peter Schelian</dc:creator>
      <georss:point>49.749137 8.109198</georss:point>
      <wfw:comment>http://blog.schelian.de/CommentView,guid,1540d036-fe5e-4a60-9bfa-47806956a3af.aspx</wfw:comment>
      <wfw:commentRss>http://blog.schelian.de/SyndicationService.asmx/GetEntryCommentsRss?guid=1540d036-fe5e-4a60-9bfa-47806956a3af</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In einer Anwendung verwende ich eine Klasse um die Appointmens eines Kalenders abzubilden.
Diese Klasse ist relativ Komplex und um diesen Beitrag nicht ebenfalls zu komplex
werden zu lassen, verwende ich hier eine (sehr) abgespeckte Version dieser Klasse
um das Thema Sortierung einer ArrayListe von Komplexen Objekten zu veranschaulichen.<br />
Die Verwendung einer ArrayList war hier zwingend vorgeschrieben (typisierte Listen
List&lt;Type&gt; kamen nicht in Frage)
</p>
        <p>
          <u>Zuerst einmal die Aufgabenstellung:</u>
        </p>
        <p>
In einer ArrayListe (nennen wir Sie AppointmentList) befinden sich Termine in Form
von Objekten (nennen wir sie Appointment). Diese Objekte haben unter anderem eine
Eigenschaft (Property) Startdatum (vom Type DateTime). 
</p>
        <p>
Da die Appointment in der AppointmentList unsortiert vorliegen und eine Sortierung
(eigentlich zwei Sortierungen Auf und Absteigend) nach dem Startdatum des Termins
benötigt wird, bestand die Aufgabe die AppointmentList zu sortieren.
</p>
        <p>
Die ArrayLIst verfügt über eine Methode Sort. Da es sich bei den zu sortierenden Objekten
aber um ein Komplexe Klasse handelt, muss man der Sort Methode einen Comparer an die
Hand geben, damit die Methode Sort Ihre Aufgabe durchführen kann.
</p>
        <p>
          <u>Hier nun die Umsetzung: </u>
        </p>
        <p>
Zuerst einmal die (komplexe) Klasse Appointment (eine abgespeckte Variante)
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:62c1ccd5-da57-4c55-a404-fc18bad013fb" class="wlWriterEditableSmartContent">
          <pre name="code" class="c#">public class Appointment
{

    public Appointment()
    {
        appointmentGUID = Guid.NewGuid();
    }


    private readonly Guid appointmentGUID = new Guid("00000000000000000000000000000000");

    public Guid AppointmentGUID
    {
        get { return appointmentGUID; }
    }

    private DateTime startDate;

    public DateTime StartDate
    {
        get { return startDate; }
        set
        {
            startDate = value;
            OnStartDateChanged();
        }
    }

    protected virtual void OnStartDateChanged()
    {
    }


    private DateTime endDate;

    public DateTime EndDate
    {
        get { return endDate; }
        set
        {
            endDate = value;
            OnEndDateChanged();
        }
    }

    protected virtual void OnEndDateChanged()
    {
    }



    private string title = "";

    [DefaultValue("")]
    public string Title
    {
        get { return title; }
        set
        {
            title = value;
            OnTitleChanged();
        }
    }

    protected virtual void OnTitleChanged()
    {
    }


    public override string ToString()
    {
        return Title;
    }

}</pre>
        </div>
        <p>
Der Comparer für diese Aufgabe sieht dann so aus (Methode zum Sortieren mit Implementierung
der IComparer Schnittstelle:
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:5e5eb77a-7651-4023-bae5-9bc19c1872a3" class="wlWriterEditableSmartContent">
          <pre name="code" class="c#">public class AppointmentComparer : IComparer
{
    private bool descendSorting;
    public AppointmentComparer(bool descend)
    {
        descendSorting = descend;
    }

    int IComparer.Compare(object a, object b)
    {
        var b1 = (Appointment)a;
        var b2 = (Appointment)b;

        if (descendSorting)
        {
            return DateTime.Compare(b2.StartDate, b1.StartDate);
        }
        else
        {
            return DateTime.Compare(b1.StartDate, b2.StartDate);
        }
    }

}</pre>
        </div>
        <p>
Und verwenden kann man diesen Comparer wie folgt:
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8b82adc1-0197-4da0-98d5-924ba22e3905" class="wlWriterEditableSmartContent">
          <pre name="code" class="c#">            al.Sort(new AppointmentComparer(false));
            al.Sort(new AppointmentComparer(true));
</pre>
        </div>
        <p>
al wurde dabei wie folgt deklariert:
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2ebe9b8c-0c12-419f-b804-26d0a8f21a2b" class="wlWriterEditableSmartContent">
          <pre name="code" class="c#">ArrayList al = new ArrayList();</pre>
        </div>
        <img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=1540d036-fe5e-4a60-9bfa-47806956a3af" />
      </body>
      <title>C# - ArrayList.Sort mit Komplexen Klassen (IComparer Implementierung)</title>
      <guid isPermaLink="false">http://blog.schelian.de/PermaLink,guid,1540d036-fe5e-4a60-9bfa-47806956a3af.aspx</guid>
      <link>http://blog.schelian.de/2009/08/07/CArrayListSortMitKomplexenKlassenIComparerImplementierung.aspx</link>
      <pubDate>Fri, 07 Aug 2009 11:14:00 GMT</pubDate>
      <description>&lt;p&gt;
In einer Anwendung verwende ich eine Klasse um die Appointmens eines Kalenders abzubilden.
Diese Klasse ist relativ Komplex und um diesen Beitrag nicht ebenfalls zu komplex
werden zu lassen, verwende ich hier eine (sehr) abgespeckte Version dieser Klasse
um das Thema Sortierung einer ArrayListe von Komplexen Objekten zu veranschaulichen.&lt;br&gt;
Die Verwendung einer ArrayList war hier zwingend vorgeschrieben (typisierte Listen
List&amp;lt;Type&amp;gt; kamen nicht in Frage)
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Zuerst einmal die Aufgabenstellung:&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
In einer ArrayListe (nennen wir Sie AppointmentList) befinden sich Termine in Form
von Objekten (nennen wir sie Appointment). Diese Objekte haben unter anderem eine
Eigenschaft (Property) Startdatum (vom Type DateTime). 
&lt;/p&gt;
&lt;p&gt;
Da die Appointment in der AppointmentList unsortiert vorliegen und eine Sortierung
(eigentlich zwei Sortierungen Auf und Absteigend) nach dem Startdatum des Termins
benötigt wird, bestand die Aufgabe die AppointmentList zu sortieren.
&lt;/p&gt;
&lt;p&gt;
Die ArrayLIst verfügt über eine Methode Sort. Da es sich bei den zu sortierenden Objekten
aber um ein Komplexe Klasse handelt, muss man der Sort Methode einen Comparer an die
Hand geben, damit die Methode Sort Ihre Aufgabe durchführen kann.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Hier nun die Umsetzung: &lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
Zuerst einmal die (komplexe) Klasse Appointment (eine abgespeckte Variante)
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:62c1ccd5-da57-4c55-a404-fc18bad013fb" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;public class Appointment
{

    public Appointment()
    {
        appointmentGUID = Guid.NewGuid();
    }


    private readonly Guid appointmentGUID = new Guid("00000000000000000000000000000000");

    public Guid AppointmentGUID
    {
        get { return appointmentGUID; }
    }

    private DateTime startDate;

    public DateTime StartDate
    {
        get { return startDate; }
        set
        {
            startDate = value;
            OnStartDateChanged();
        }
    }

    protected virtual void OnStartDateChanged()
    {
    }


    private DateTime endDate;

    public DateTime EndDate
    {
        get { return endDate; }
        set
        {
            endDate = value;
            OnEndDateChanged();
        }
    }

    protected virtual void OnEndDateChanged()
    {
    }



    private string title = "";

    [DefaultValue("")]
    public string Title
    {
        get { return title; }
        set
        {
            title = value;
            OnTitleChanged();
        }
    }

    protected virtual void OnTitleChanged()
    {
    }


    public override string ToString()
    {
        return Title;
    }

}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Der Comparer für diese Aufgabe sieht dann so aus (Methode zum Sortieren mit Implementierung
der IComparer Schnittstelle:
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:5e5eb77a-7651-4023-bae5-9bc19c1872a3" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;public class AppointmentComparer : IComparer
{
    private bool descendSorting;
    public AppointmentComparer(bool descend)
    {
        descendSorting = descend;
    }

    int IComparer.Compare(object a, object b)
    {
        var b1 = (Appointment)a;
        var b2 = (Appointment)b;

        if (descendSorting)
        {
            return DateTime.Compare(b2.StartDate, b1.StartDate);
        }
        else
        {
            return DateTime.Compare(b1.StartDate, b2.StartDate);
        }
    }

}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Und verwenden kann man diesen Comparer wie folgt:
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8b82adc1-0197-4da0-98d5-924ba22e3905" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;            al.Sort(new AppointmentComparer(false));
            al.Sort(new AppointmentComparer(true));
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
al wurde dabei wie folgt deklariert:
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2ebe9b8c-0c12-419f-b804-26d0a8f21a2b" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;ArrayList al = new ArrayList();&lt;/pre&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=1540d036-fe5e-4a60-9bfa-47806956a3af" /&gt;</description>
      <comments>http://blog.schelian.de/CommentView,guid,1540d036-fe5e-4a60-9bfa-47806956a3af.aspx</comments>
      <category>Programmierung/Code</category>
      <category>Sprachen/C#</category>
    </item>
    <item>
      <trackback:ping>http://blog.schelian.de/Trackback.aspx?guid=aeebff9e-fa49-44c3-99b5-b1ad65c89c00</trackback:ping>
      <pingback:server>http://blog.schelian.de/pingback.aspx</pingback:server>
      <pingback:target>http://blog.schelian.de/PermaLink,guid,aeebff9e-fa49-44c3-99b5-b1ad65c89c00.aspx</pingback:target>
      <dc:creator>Hans-Peter Schelian</dc:creator>
      <georss:point>49.749137 8.109198</georss:point>
      <wfw:comment>http://blog.schelian.de/CommentView,guid,aeebff9e-fa49-44c3-99b5-b1ad65c89c00.aspx</wfw:comment>
      <wfw:commentRss>http://blog.schelian.de/SyndicationService.asmx/GetEntryCommentsRss?guid=aeebff9e-fa49-44c3-99b5-b1ad65c89c00</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Beim stöbern in meinen SQL Skripten bin ich gerade wieder auf das hier nachfolgend
aufgeführte Skript zur Ausgabe der “Größe aller Tabellen einer Datenbank” gestoßen.
</p>
        <p>
Da ich sicherlich nicht der einzige bin, der diese Informationen einer Datenbank hin
und wieder benötigt, veröffentliche ich hier das Skript mit der Hoffnung dass es jemand
gebrauchen kann.
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9ad3bd5d-f0a7-4181-a2a5-1686681a7375" class="wlWriterEditableSmartContent">
          <pre name="code" class="sql">SET NOCOUNT ON
CREATE TABLE #TableSpace 
(
	Rows int, 
	DataSpaceUsed int, 
	IndexSpaceUsed int
)
DECLARE @TableSpace table
(
	TableName varchar(255),
	Rows int, 
	DataSpaceUsed int, 
	IndexSpaceUsed int
)
DECLARE @Rows int, @DataSpaceUsed int, @IndexSpaceUsed int
DECLARE @TableName varchar(255)
DECLARE Table_Cursor CURSOR FOR
SELECT	user_name(o.uid) + '.' + o.name AS table_name
FROM	dbo.sysobjects o, dbo.sysindexes i 
WHERE	OBJECTPROPERTY(o.id, N'IsTable') = 1 
	AND i.id = o.id 
	AND i.indid &lt; 2 
	AND o.name NOT LIKE N'#%' 
	AND xtype = 'U'
ORDER BY 1
OPEN Table_Cursor
---------------------------------
--Set Data
FETCH NEXT FROM Table_Cursor INTO @TableName
INSERT INTO #TableSpace (Rows, DataSpaceUsed, IndexSpaceUsed)
EXEC sp_MStablespace @TableName
SELECT	@Rows = Rows, 
	@DataSpaceUsed = DataSpaceUsed,
	@IndexSpaceUsed = IndexSpaceUsed
FROM	#TableSpace
INSERT INTO @TableSpace (TableName, Rows, DataSpaceUsed, IndexSpaceUsed)
VALUES (@TableName, @Rows, @DataSpaceUsed, @IndexSpaceUsed)
DELETE FROM #TableSpace
--------------------------------
WHILE @@FETCH_STATUS = 0


    BEGIN
    	---------------------------------
    	--Set Data
    	FETCH NEXT FROM Table_Cursor INTO @TableName
    	
    	INSERT INTO #TableSpace (Rows, DataSpaceUsed, IndexSpaceUsed)
    	EXEC sp_MStablespace @TableName
    	
    	SELECT	@Rows = Rows, 
    		@DataSpaceUsed = DataSpaceUsed,
    		@IndexSpaceUsed = IndexSpaceUsed
    	FROM	#TableSpace
    	
    	INSERT INTO @TableSpace (TableName, Rows, DataSpaceUsed, IndexSpaceUsed)
    	VALUES (@TableName, @Rows, @DataSpaceUsed, @IndexSpaceUsed)
    	
    	DELETE FROM #TableSpace
    	--------------------------------
END

CLOSE Table_Cursor
DEALLOCATE Table_Cursor
DROP TABLE #TableSpace
SELECT * 
FROM @TableSpace
ORDER BY Rows DESC
</pre>
        </div>
        <p>
Über die Herkunft dieses Skripts (ich weiß dass ich zumindest die Idee von irgendwoher
hatte) bin ich mir nicht mehr sicher. Eine gerade durchgeführte Recherche im Internet
hat mir auch keinen direkten Aufschluss gegeben woher ich das Skript oder die Idee
dazu hatte.
</p>
        <p>
Sollte also jemand die Herkunft kennen, bitte einfach per Kommentar posten.
</p>
        <img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=aeebff9e-fa49-44c3-99b5-b1ad65c89c00" />
      </body>
      <title>SQL - Größe aller Tabellen einer Datenbank</title>
      <guid isPermaLink="false">http://blog.schelian.de/PermaLink,guid,aeebff9e-fa49-44c3-99b5-b1ad65c89c00.aspx</guid>
      <link>http://blog.schelian.de/2009/08/05/SQLGr%c3%b6%c3%9feAllerTabellenEinerDatenbank.aspx</link>
      <pubDate>Wed, 05 Aug 2009 07:26:38 GMT</pubDate>
      <description>&lt;p&gt;
Beim stöbern in meinen SQL Skripten bin ich gerade wieder auf das hier nachfolgend
aufgeführte Skript zur Ausgabe der “Größe aller Tabellen einer Datenbank” gestoßen.
&lt;/p&gt;
&lt;p&gt;
Da ich sicherlich nicht der einzige bin, der diese Informationen einer Datenbank hin
und wieder benötigt, veröffentliche ich hier das Skript mit der Hoffnung dass es jemand
gebrauchen kann.
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9ad3bd5d-f0a7-4181-a2a5-1686681a7375" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="sql"&gt;SET NOCOUNT ON
CREATE TABLE #TableSpace 
(
	Rows int, 
	DataSpaceUsed int, 
	IndexSpaceUsed int
)
DECLARE @TableSpace table
(
	TableName varchar(255),
	Rows int, 
	DataSpaceUsed int, 
	IndexSpaceUsed int
)
DECLARE @Rows int, @DataSpaceUsed int, @IndexSpaceUsed int
DECLARE @TableName varchar(255)
DECLARE Table_Cursor CURSOR FOR
SELECT	user_name(o.uid) + '.' + o.name AS table_name
FROM	dbo.sysobjects o, dbo.sysindexes i 
WHERE	OBJECTPROPERTY(o.id, N'IsTable') = 1 
	AND i.id = o.id 
	AND i.indid &amp;lt; 2 
	AND o.name NOT LIKE N'#%' 
	AND xtype = 'U'
ORDER BY 1
OPEN Table_Cursor
---------------------------------
--Set Data
FETCH NEXT FROM Table_Cursor INTO @TableName
INSERT INTO #TableSpace (Rows, DataSpaceUsed, IndexSpaceUsed)
EXEC sp_MStablespace @TableName
SELECT	@Rows = Rows, 
	@DataSpaceUsed = DataSpaceUsed,
	@IndexSpaceUsed = IndexSpaceUsed
FROM	#TableSpace
INSERT INTO @TableSpace (TableName, Rows, DataSpaceUsed, IndexSpaceUsed)
VALUES (@TableName, @Rows, @DataSpaceUsed, @IndexSpaceUsed)
DELETE FROM #TableSpace
--------------------------------
WHILE @@FETCH_STATUS = 0


    BEGIN
    	---------------------------------
    	--Set Data
    	FETCH NEXT FROM Table_Cursor INTO @TableName
    	
    	INSERT INTO #TableSpace (Rows, DataSpaceUsed, IndexSpaceUsed)
    	EXEC sp_MStablespace @TableName
    	
    	SELECT	@Rows = Rows, 
    		@DataSpaceUsed = DataSpaceUsed,
    		@IndexSpaceUsed = IndexSpaceUsed
    	FROM	#TableSpace
    	
    	INSERT INTO @TableSpace (TableName, Rows, DataSpaceUsed, IndexSpaceUsed)
    	VALUES (@TableName, @Rows, @DataSpaceUsed, @IndexSpaceUsed)
    	
    	DELETE FROM #TableSpace
    	--------------------------------
END

CLOSE Table_Cursor
DEALLOCATE Table_Cursor
DROP TABLE #TableSpace
SELECT * 
FROM @TableSpace
ORDER BY Rows DESC
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Über die Herkunft dieses Skripts (ich weiß dass ich zumindest die Idee von irgendwoher
hatte) bin ich mir nicht mehr sicher. Eine gerade durchgeführte Recherche im Internet
hat mir auch keinen direkten Aufschluss gegeben woher ich das Skript oder die Idee
dazu hatte.
&lt;/p&gt;
&lt;p&gt;
Sollte also jemand die Herkunft kennen, bitte einfach per Kommentar posten.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=aeebff9e-fa49-44c3-99b5-b1ad65c89c00" /&gt;</description>
      <comments>http://blog.schelian.de/CommentView,guid,aeebff9e-fa49-44c3-99b5-b1ad65c89c00.aspx</comments>
      <category>Allgemein/Tips und Tricks</category>
      <category>Server/SQL Server</category>
      <category>Sprachen/SQL</category>
    </item>
    <item>
      <trackback:ping>http://blog.schelian.de/Trackback.aspx?guid=7826231c-9b24-4db4-ba2d-78ccbcfb488b</trackback:ping>
      <pingback:server>http://blog.schelian.de/pingback.aspx</pingback:server>
      <pingback:target>http://blog.schelian.de/PermaLink,guid,7826231c-9b24-4db4-ba2d-78ccbcfb488b.aspx</pingback:target>
      <dc:creator>Hans-Peter Schelian</dc:creator>
      <georss:point>49.749137 8.109198</georss:point>
      <wfw:comment>http://blog.schelian.de/CommentView,guid,7826231c-9b24-4db4-ba2d-78ccbcfb488b.aspx</wfw:comment>
      <wfw:commentRss>http://blog.schelian.de/SyndicationService.asmx/GetEntryCommentsRss?guid=7826231c-9b24-4db4-ba2d-78ccbcfb488b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Wenn man die Source Version von DotNetNuke Version 4.09.04 in Visual Studio ausführt
und als Browser den Internet Explorer 8 einsetzt, kommt es beim überfahren der Menüs
(Admin und Systemmenü) mit der Maus zu folgendem Fehler:
</p>
        <p>
          <a href="http://blog.schelian.de/content/binary/WindowsLiveWriter/DotNetNuke4.09.04SourceVersionundIE8_7CA8/image_2.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/DotNetNuke4.09.04SourceVersionundIE8_7CA8/image_thumb.png" width="521" height="258" />
          </a>
        </p>
        <p>
Dieser Fehler tritt in der Datei dnn.dom.positioning.js auf.
</p>
        <p>
Die Zeile in welcher der Fehler auftritt lautet:
</p>
        <p>
        </p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:88d4fc51-82f2-44ed-a1a3-0291a45f1c34" class="wlWriterEditableSmartContent">
          <pre name="code" class="c#">oIFR.style.zIndex=iIndex-1</pre>
        </div>
Was geschieht ist, dass in der Variablen iIndex anstelle eines Wertes, das Wort “Auto”
enthalten ist. Wenn nun versucht wird von dem String “Auto” den Wert 1 abzuziehen,
kommt es natürlich zu einem Fehler. 
<p></p><p>
Ich habe eine Lösung gefunden, die für mich funktioniert und nicht die Zeile einfach
auskommentiert.
</p><p>
Die Lösung sieht wie folgt aus:
</p><p>
Ich füge am Ende der Datei dnn.dom.positioning.js die Funktion IsNumeric ein:
</p><p></p><div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:cb932cc5-e0c2-4874-95cd-20be83037989" class="wlWriterEditableSmartContent"><pre name="code" class="c#">function IsNumeric(sText)

{
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;

 
   for (i = 0; i &lt; sText.length &amp;&amp; IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;
   
   }
</pre></div><p></p><p>
Und verwende diese Funktion wie folgt um den Inhalt der Variable iIndex zu prüfen
und im Falle das darin kein numerischer Wert enthalten ist, führe ich die Subtraktion
nicht aus.
</p><p>
Anstelle der Zeile (250) mit dem Inhalt oIFR.style.zIndex=iIndex-1;
</p><p>
füge ich nachfolgende 4 Zeilen ein, das sieht dann so aus:
</p><div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0300423d-c6c3-46a3-bb3d-ef125aea5d04" class="wlWriterEditableSmartContent"><pre name="code" class="c#">if (IsNumeric(iIndex))
    oIFR.style.zIndex = iIndex - 1;
else
    oCont.style.zIndex = 1;</pre></div><p>
Nun einfach die Datei dnn.dom.positioning.js speichern und auch Fehlerfrei mit dem
IE 8 und der Source Version von DotNetNuke arbeiten.
</p><img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=7826231c-9b24-4db4-ba2d-78ccbcfb488b" /></body>
      <title>DotNetNuke 4.09.04 Source Version und IE 8</title>
      <guid isPermaLink="false">http://blog.schelian.de/PermaLink,guid,7826231c-9b24-4db4-ba2d-78ccbcfb488b.aspx</guid>
      <link>http://blog.schelian.de/2009/07/22/DotNetNuke40904SourceVersionUndIE8.aspx</link>
      <pubDate>Wed, 22 Jul 2009 06:52:05 GMT</pubDate>
      <description>&lt;p&gt;
Wenn man die Source Version von DotNetNuke Version 4.09.04 in Visual Studio ausführt
und als Browser den Internet Explorer 8 einsetzt, kommt es beim überfahren der Menüs
(Admin und Systemmenü) mit der Maus zu folgendem Fehler:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.schelian.de/content/binary/WindowsLiveWriter/DotNetNuke4.09.04SourceVersionundIE8_7CA8/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/content/binary/WindowsLiveWriter/DotNetNuke4.09.04SourceVersionundIE8_7CA8/image_thumb.png" width="521" height="258"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Dieser Fehler tritt in der Datei dnn.dom.positioning.js auf.
&lt;/p&gt;
&lt;p&gt;
Die Zeile in welcher der Fehler auftritt lautet:
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:88d4fc51-82f2-44ed-a1a3-0291a45f1c34" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;oIFR.style.zIndex=iIndex-1&lt;/pre&gt;
&lt;/div&gt;
Was geschieht ist, dass in der Variablen iIndex anstelle eines Wertes, das Wort “Auto”
enthalten ist. Wenn nun versucht wird von dem String “Auto” den Wert 1 abzuziehen,
kommt es natürlich zu einem Fehler. 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Ich habe eine Lösung gefunden, die für mich funktioniert und nicht die Zeile einfach
auskommentiert.
&lt;/p&gt;
&lt;p&gt;
Die Lösung sieht wie folgt aus:
&lt;/p&gt;
&lt;p&gt;
Ich füge am Ende der Datei dnn.dom.positioning.js die Funktion IsNumeric ein:
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:cb932cc5-e0c2-4874-95cd-20be83037989" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;function IsNumeric(sText)

{
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;

 
   for (i = 0; i &amp;lt; sText.length &amp;amp;&amp;amp; IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;
   
   }
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Und verwende diese Funktion wie folgt um den Inhalt der Variable iIndex zu prüfen
und im Falle das darin kein numerischer Wert enthalten ist, führe ich die Subtraktion
nicht aus.
&lt;/p&gt;
&lt;p&gt;
Anstelle der Zeile (250) mit dem Inhalt oIFR.style.zIndex=iIndex-1;
&lt;/p&gt;
&lt;p&gt;
füge ich nachfolgende 4 Zeilen ein, das sieht dann so aus:
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0300423d-c6c3-46a3-bb3d-ef125aea5d04" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;if (IsNumeric(iIndex))
    oIFR.style.zIndex = iIndex - 1;
else
    oCont.style.zIndex = 1;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Nun einfach die Datei dnn.dom.positioning.js speichern und auch Fehlerfrei mit dem
IE 8 und der Source Version von DotNetNuke arbeiten.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.schelian.de/aggbug.ashx?id=7826231c-9b24-4db4-ba2d-78ccbcfb488b" /&gt;</description>
      <comments>http://blog.schelian.de/CommentView,guid,7826231c-9b24-4db4-ba2d-78ccbcfb488b.aspx</comments>
      <category>DotNetNuke</category>
      <category>DotNetNuke/Entwicklung</category>
    </item>
  </channel>
</rss>