Blog Home  Home Feed your aggregator (RSS 2.0)  
artiso Blog - Thursday, August 16, 2007
Neues rund um's Thema .Net
 
 Thursday, August 16, 2007

Scott Mitchell hat 75 Tutorials zum Thema Data Access mit ASP.Net 2.0 geschrieben. Hier ist praktisch alles an Technologie beschrieben, was für die Programmierung von datenbankbasierten Webanwendungen mit ASP.Net 2.0 notwendig ist. Einzig LINQ wird momentan noch ausgespart. Eine wirklich tolle Sammlung an guten Informationen.

image

Data Access Tutorials : The Official Microsoft ASP.NET 2.0 Site

Thursday, August 16, 2007 10:06:18 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    |  |  |  |   | 

Wenn man mit LINQ to SQL arbeitet, dann steht man sehr schnell vor dem Problem, dass man sehen möchte, wass denn LINQ mit der Datenbank so treibt. Der SQL Profiler kann zwar die abgesetzten SQL-Statements anzeigen, die zurückgegebenen Ergebnisse muss mann dann aber von Hand abfragen. Viel eleganter geht es mit dem LINQ to SQL Debug Visualizer von Scott Guthrie. Damit kann man die Abfrage im Debug-Modus von Visual Studio 2008 einfach anzeigen lassen:

Mit dem Execute-Button kann man die Abfrage einfach ausführen und das Ergebnis anzeigen lassen.

Ein echt cooles Tool. Download und eine Installationsanleitung gibt es hier.

LINQ to SQL Debug Visualizer - ScottGu's Blog

Thursday, August 16, 2007 9:53:05 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Wednesday, August 15, 2007

Ich habe folgendes Datenmodell mit dem LINQ To SQL Designer aufgebaut:

image

So, eigentlich ganz einfach. Mit folgendem Code kann ich die Daten einlesen:

    var formList = from f in listDataContext.cFormListItems
                   orderby f.FormShort                            
                   select f;
    var countryList = from c in listDataContext.cCountryListItems 
                      orderby c.CountryName 
                      select c;

Damit liest LINQ die Daten für die Forms bzw. die Countries ein, die zugeordneten Tabellen bleiben leer, bis man auf das entsprechende Element zugreift, dann wird das nachgeladen (lazy loading). Dieser Effekt ist super, wenn ich z.B. eine Liste der Kunden habe und den Kunden Bestellungen zugeordnet sind und ich teilweise Kunden mit mehreren tausend Bestellungen habe. Dann will ich die Bestellungen nicht gleich alle mitladen. Aber in meinem Fall war es so, dass in den verknüpften Tabellen nur wenige Datensätze stehen und ich deshalb lieber alles auf einen Rutsch laden wollte. Das geht dann so:

    listDataContext = new cListDataContext("Data Source=NOTEBOOK_VISTA;Initial Catalog=ValuePlanner_2008;Integrated Security=True");
    
    // Define LoadOptions to load some related tables with their parent tables in one select statement
    DataLoadOptions loadOptions = new DataLoadOptions();
    loadOptions.LoadWith<cFormListItem>(f => f.FormType);
    loadOptions.LoadWith<cCountryListItem>(c => c.Market);
    listDataContext.LoadOptions = loadOptions;

Diesen Code muss man vor der ersten Abfrage ausführen. Hier werden zwei LoadWith (jeweils für eine untergeordnete Tabelle) mit angegeben. Dies bewirkt, dass die untergeordneten Tabellen mit der jeweiligen Haupttabelle in einem einzigen SELECT Statement aus der Datenbank geladen werden! Ein paar Sachen muss man allerdings beachten:

  • Die LoadOptions können nur vor der ersten Abfrage auf dem DataContext zugewiesen werden.
  • Die Loadoptions können nicht mehr verändert werden, wenn sie einmal einem DataContext zugewiesen wurden.
  • Für mehrere Tabellen ruft man das LoadWith einfach mehrfach auf.

Ich hätte das zwar schöner gefunden, wenn man das auch mit im Designer einstellen könnte, aber es funktioniert einwandfrei.

Hier noch als Beweis das SQL-Statement, das dann tatsächlich auf der Datenbank ausgeführt wird:

SELECT [t0].[ID], [t0].[FormLong], [t0].[FormShort], [t0].[FormTypeID], [t1].[ID] AS [ID2], [t1].[FormTypeLong], [t1].[FormTypeShort]
FROM [values_Forms] AS [t0]
INNER JOIN [values_FormTypes] AS [t1] ON [t1].[ID] = [t0].[FormTypeID]
ORDER BY [t0].[FormShort]
Wednesday, August 15, 2007 6:17:42 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Friday, August 10, 2007

Die Arbeitsbereiche des Team Foundation Server stellen eine Verknüpfung eines lokalen Verzeichnisses mit einem Pfad in der Quellcode-Verwaltung her. Aus verständlichen Gründen kann ein und das selbe Verzeichnis nicht mehrfach zugeordnet werden. Dies gilt insbesondere für den Fall, dass zwei verschiedene Benutzer auf dem gleichen Rechner das selbe Verzeichnis zuordnen wollen, auch wenn es sich auf den gleichen Pfad in der Quellcode-Verwaltung bezieht. Das ganze macht Sinn. Aber was tun, wenn z.B. der Benutzer A nicht mehr existiert und nun Benutzer B seine Projekte übernehmen soll? Der Rat lautet hier, von Benutzer A alle Arbeitsbereiche löschen, bevor der Benutzer gelöscht wird. Der Rat hilft aber wenig, wenn der Benutzer bereits gelöscht wurde und man dann erst die Probleme feststellt. Oder wenn, wie in meinem Fall, durch einen Umzug auf einen anderen Server der Benutzer neu angelegt wurde und zwar den gleichen Namen hat, aber eine andere SID. Die Anpassung der SIDs in der TFS-Datenbank scheint hier nicht richtig funktioniert zu haben.

Den lokalen Workspace zu löschen ist kein Problem, aber das hilft leider in diesem Fall nicht. Die Arbeitsbereiche sind auch zusätzlich noch auf dem Server gespeichert und dort muss man diesen nun löschen, damit man den mit dem neuen Benutzer neu einrichten kann.

Zunächst der Befehl, mit dem man die Workspaces vom Server anzeigen kann:

tf workspaces /owner:* /server:<TFS-Servername> /format:detailed

Um einen Workspace zu löschen kann nun folgender Befehl verwendet werden:

tf workspace /delete <Workspace-Name>;<Benutzername>  /server:<TFS-Servername>

Es gibt auch noch den Befehl /updateUserName, der hat in meinem Fall aber leider nicht funktioniert.

Friday, August 10, 2007 7:16:46 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Wednesday, August 08, 2007

Will man in einem Infragistics WebGrid ein Control in einer Zelle einer TemplatedColumn ansprechen, dann ist das gar nicht so einfach wie zunächst vermutet. Man muss ein paar Umwege einlegen. So funktionierts aber dann:

protected void UltraWebGrid1_InitializeRow(object sender, Infragistics.WebUI.UltraWebGrid.RowEventArgs e)
{
   
DropDownList ddlUnit = ((DropDownList)((CellItem)((TemplatedColumn)e.Row.Cells.FromKey("Unit").Column).CellItems[e.Row.Index]).Controls[1]);
    ....
}

Statt dem Controls[1] könnte man auch noch ein FindControl() nutzen, das wäre noch etwas eleganter.

Wednesday, August 08, 2007 10:05:43 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    |   | 
 Saturday, July 28, 2007

Scott Guthrie beschreibt ein paar coole neue Features von Visual Studio 2008 in seinem Blog: 

Nice VS 2008 Code Editing Improvements
JavaScript intellisense
CSS style intellisense

Saturday, July 28, 2007 9:14:39 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 

Scott Gutherie hat in seinem Blog eine interessante Artikel-Serie zu LINQ to SQL

Data Access Improvements with LINQ to SQL

LINQ to SQL is a built-in OR/M (object relational mapper) in .NET 3.5.  It enables you to model relational databases using a .NET object model.  You can then query the database using LINQ, as well as update/insert/delete data from it.  LINQ to SQL fully supports transactions, views, and stored procedures.  It also provides an easy way to integrate business logic and validation rules into your data model.  Below are some of the articles I've written that explore how to use it:

I'll be adding several more articles to my series above in the weeks ahead.  I think you'll find that LINQ to SQL makes it dramatically easier to build much cleaner data models, and write much cleaner data code.

Saturday, July 28, 2007 3:39:55 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    |  |   | 

Die Beta 2 des Visual Studio 2008 (Oracs) sowie des Visual Studio 2008 Team Foundation Server Beta 2 sind jetzt verfügbar.

Visual Studio 2008 Downloads

Saturday, July 28, 2007 3:24:39 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 

Unter C# einen Splash-Screen zu erzeugen ist immer etwas Arbeit.  Dirk Hammann hat eine kleine Komponente erstellt, die das erledigt. Die Komponente ist Freeware und auch als Quellcode verfügbar.

SplashDialog

Saturday, July 28, 2007 3:22:04 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 

Visual Studio 2008 TFS (ehemals Orcas TFS) wird WSS 3.0 von Haus aus unterstützen.  Möchte man die WSS 3.0 auch mit einem Visual Studio 2005 TFS einsetzen, dann hilft diese Anleitung:

TN1501: Configuring Windows SharePoint Services 3.0 on the Visual Studio 2005 Team Foundation Server Application Tier

Saturday, July 28, 2007 2:28:29 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [1]    | 
 Friday, July 27, 2007

 Auf knapp 200 Seiten haben Kai Gloth und Norbert Eder viele Tipps und Tricks zusammengafasst und diese als PDF-Datei kostenlos bereitgestellt.

.NET Casts - dotnetblogbook

Friday, July 27, 2007 10:40:53 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Thursday, July 26, 2007

Hat man ein typisiertes DataSet und arbeitet darin mit mehreren TableAdaptern, dann stellt sich die Frage, wie Updates auf diesen TableAdaptern in eine Transaktion zusammengefasst werden können. Das Problem dabei ist, dass jeder TableAdapter seine eigene Connection nutzt. Es gibt grundsätzlich zwei Lösungsansätze:

  1. Man verwendet den TransactionScope aus dem System.Transactions-Namespace. Diese Vorgehensweise hat allerdings den Nachteil, dass die verschiedenen Connections nur über eine Distributed Transactions verwaltet werden können. Das ist nicht unbedingt das Nonplusultra was die Performance angeht und eigentlich ja auch mit Kanonen auf Spatzen geschossen, da typischerweise alle TableAdapter ja auf die gleiche Datenbank gehen dürften und damit die Ditributed Transactions etwas überkandidelt sind.
  2. Man verwendet eine Connection für alle TableAdpater. Hierzu gibt es glücklicherweise die Möglichkiet, dass man die Connection der Tableadapter austauschen kann. Man kann z.B. einfach die Connection des ersten TableAdapters allen anderen zuweisen und dann auf dieser Connection mit BeginTransaction eine neue Transaktion beginnen und diese dann mit Commit bzw. RollBack abschließen. Alternativ kann man natürlich auch manuell eine Connection erzeugen und diese dann allen TableAdaptern zuweisen.

Eine sehr schöne Beschreibung dieser Lösungsansätze hat John Waters unter folgendem Link veröffentlicht: ADO.NET : Getting TableAdapters to participate in transactions

Thursday, July 26, 2007 5:05:23 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    |   | 
 Tuesday, July 24, 2007

Wenn der Team-Explorer behauptet, einen nicht mehr zu kennen und mit folgender Meldung behauptet, man stellt keine bekannte Identität dar,

image

dann kann dieses Problem behoben werden, indem man den Cache des Team-Explorers löscht. Dieser liegt unter Vista im Ordner C:\Users\Thomas\AppData\Local\Microsoft\Team Foundation\1.0\Cache. Hier einfach alle Unterordner löschen und schon klappts wieder mit dem TFS.

Tuesday, July 24, 2007 9:35:46 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Friday, July 20, 2007

 

Alle Entwickler haben jetzt die Chance attraktive Sachpreise zu gewinnen.

Marco Hagenschulte, Betreiber von www.wsus.de, hat das Gewinnspiel „Tools für WSUS 3.0“ gestartet. Gesucht wird ein nützliches selbst-entwickeltes Werkzeug für die Windows Server Update Services 3.0 (Add-On, Sidebar Gadget, Scripts, usw.).

 

Zum Gewinnspiel

Friday, July 20, 2007 4:33:27 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Wednesday, July 18, 2007

Habe gerade den ersten Praxis-Test mit Microsoft SharedView absolviert. Das hat auf Anhieb geklappt, echt klasse.

image

Das Tool erlaubt es, dass man eine Session einrichtet und die Teilnehmer der Session untereinander ihre Desktops oder auch nur einzelne Anwendungen freigeben können. Dabei können die anderen entweder nur zuschauen oder auch aktiv eingreifen. Das tolle dabei ist, dass für alle Teilnehmer eine einfache Internet-Verbindung genügt, auch für den Session-Initiator.

Ich wollte gerade einen externen Kollegen bei einer Fehlersuche unterstützen. Am Telefon war das aber kaum zu erklären. Wir haben einfach beide SharedView runtergeladen und installiert. Die Verbindung hat auf Anhieb geklappt, obwohl wir beide hinter einer Firewall sitzen. ich konnte mich auf seinen Desktop schalten und diesen bedienen. Das Ganze ist noch nicht sehr schnell, aber es handelt sich dabei ja noch um eine Beta-Version und hoffentlich wird das Release in Punkto Performance noch etwas zulegen. Das einzige, was am Anfang zu etwas Verwirrung geführt hat, war, dass der Kollege mir zwar die Kontrolle über seinen Desktop übertragen hat, die dann aber immer gleich wieder zurücksprang. Wir haben dann aber schnell rausgefunden, dass die Kontrolle wieder zurückgeht, wenn am Freigabe-Rechner die Maus bewegt wird. Wenn man's weiss, eigentlich gar nicht so schlecht.

Ich fand das Ding echt superklasse und wir konnten den Fehler recht schnell beheben. (Sicher schneller als per Telefon und auch schneller als wenn wir erst den remote desktop auf der Firewall hätten freischalten lassen müssen)

Microsoft SharedView Beta

Wednesday, July 18, 2007 10:38:00 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [2]    | 
 Tuesday, July 17, 2007

Microsoft Surface ist eine neue revolutionäre Oberfläche, ein Tisch, ein Display, alles in einem und von allem etwas. Jedenfalls ist Microsoft Surface eine gigantische neue Möglichkeit, mit dem Computer zu interagieren, ohne Tastatur, ohne Maus.

Ich hoffe, das Ding wird bald auch in Deutschland irgendwo zu bestaunen sein. Es lohnt sich, schon mal einen Blick auf die schöne neue Welt von morgen zu werfen. 

Microsoft Surface

Tuesday, July 17, 2007 11:02:21 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 

Regionerate ist ein kleines Tool mit dem sich automatisch verschiedene Code-Elemente wie Properties, Methoden, Konstruktoren in separate Regions zusammenfassen lassen. Die entsprechenden Codezeilen werden dabei automatisch in bereits existierende Regions verschoben und hier sortiert. Die Regeln für die Gruppierung lassen sich anpassen.

Ein kleiner Screencast zeigt, was das Tool alles kann.

Damit entfällt nun endlich das lästige manuelle Sortieren der Felder und Properties.

Regionerate

Gefunden bei Dani Meier

Tuesday, July 17, 2007 7:09:00 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Monday, July 16, 2007

Die nächsten Termine der .net Developer-Group Ulm sind:

02.08.2007 - 18:00 Uhr
Thema: LINQ – Language Integrated Query

05.09.2007 - 18:00 Uhr
Thema: Windows Workflow Foundation in ASP.NET

Nähere Details unter www.dotnet-ulm.de

Monday, July 16, 2007 4:46:34 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 

Ich werde in nächster Zeit bei einigen Usergroups unterwegs sein und einen Vortrag zum Thema Team Foundation Server halten. Die Termine sind momentan:

24.07.07   .net Developers Group München

25.09.07   bonn-to-code.net

01.10.07   .Net Usergroup Leipzig

31.10.07   .Net Developers Group Stuttgart

Thema: Team Foundation Server in der Praxis

Mit Team Foundation Server bietet Microsoft zusammen mit Visual Studio Team System ein leistungsfähiges System zur Organisation des gesamten Software Lifecycles. Die Key-Features sind:

  • Verwaltung von Funktionsanforderungen, Aufgaben und Fehlern
  • Quellcode-Verwaltung und Branching-Strategien
  • Buildmanagement
  • Überwachung von Projektmetriken und Reporting

Wie diese Funktionen in der Praxis genutzt werden können und ob dies auch von kleinere Teams sinnvoll eingesetzt werden können, beleuchtet dieser Vortrag. Darüber hinaus werden einige Beispielszenarien aus der Praxis live vorgeführt.

Weitere Termine sind in Vorbereitung. Wer noch Interesse an einem Vortragstermin hat, kann sich gerne an mich wenden.

Monday, July 16, 2007 4:29:09 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 

Dieser Guide beinhaltet auf 360 Seiten eine Vielzahl von Bestpractices zum Einsatz eines Team Foundation Servers und stellt eine Zusammenstellung der patterns & practice Dokumente zum TFS dar

http://www.codeplex.com/TFSGuide

Monday, July 16, 2007 3:59:58 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Tuesday, July 10, 2007

Markus Alt hat in seinem Blog einen Link zu einem Whitepaper, das die Umsetzung eines Entwicklungsprozesses nach dem V-Modell XT mit Hilfe des Team Foundation Servers beschreibt. Das Dokument ist als PDF und als MSDN-Artikel verfügbar.

Tuesday, July 10, 2007 5:56:36 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Friday, June 29, 2007

Ich nutze von meinem Notebook eine VPN-Verbindung über WLAN. Dabei habe ich immer wieder das Problem, dass die VPN-Verbindung behauptet, ich brauche zuerst eine Internet-Verbindung um die VPN-Verbindung nutzen zu können obwohl die Internet-Verbindung steht.

Inzwischen habe ich rausgefunden, dass das an den Virtal Ethernet Adapter liegt, die VMware auf meinem Rechner installiert haben. Wenn ich diese Adapter disable, dann funktioniert die VPN-Verbindung auf Anhieb.

Friday, June 29, 2007 9:03:03 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [2]    | 
 Friday, June 22, 2007

In Excel kann man ein Textfeld anlegen und diesem einen variablen Inhalt geben. Hierzu markiert man das Textfeld und gibt in der Formelzeile z.B. einen Verweis auf eine Zelle ein (=A1). In A1 kann nun eine beliebige Formel stehen, z.B. ="Summe: " & SUMME(A2:A20). Möchte man in den text einen Zeilenumbruch einfügen, dann kann man die Funktion ZEICHEN(10) verwenden, also z.B. = "Summe 2006: " & SUMME(A2:A20) & ZEICHEN(10) & "Summe 2007: " & SUMME(B2:B20)

Friday, June 22, 2007 4:22:39 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Tuesday, June 19, 2007

CLIP Logo

Seit Anfang Mai bin ich nun CLIP-Mitglied. Leider bin ich im Moment derart im Stress, dass ich erst jetzt dazu komme das hier zu bloggen. Leider leidet unter meiner aktuellen Arbeitsbelastung auch mein Blog, den ich momentan sehr vernachlässige, aber das wird sich hoffentlich bald wieder ändern.

http://www.microsoft.com/germany/community/programme/clip.mspx

Tuesday, June 19, 2007 9:51:23 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Tuesday, June 05, 2007

Gerade hatte ich mal mit den Settings für Winform-Anwendungen etwas rumgespielt und bin dabei darauf gestoßen dass man auch für Klassenbibliotheken eine Settings-Datei anlegen und darin Werte erfassen kann. Die Frage war nun, wie kann ich diese Werte einstellen, wenn ich die Klassenbibliothek in eine Anwendung integriere? Nach einigem Googeln und Testen hier nun meine Ergebnisse:

  1. Die Konfiguration der Anwendung inkl. aller Klassenbibliotheken werden über eine zentrale konfigurationsdatei (app.config bzw. <Anwendungsname>.exe.config) vorgenommen.
  2. Die Konfigurationsparameter der Klassenbibliothek werden in diese zentrale Konfigurationsdatei leider nicht automatisch übertragen.
  3. Werden keine Konfigurationsparameter für die Klassenbibliothek angegeben, behält diese ihre Default-Werte (das sind die, die beim Kompilieren in der app.config der Klassenbibliothek standen). Diese Default-Werte sind in der Settings.Designer.cs hinterlegt und werden in die DLL reinkompiliert.
  4. Man kann diese Default-Werte übersteuern, indem man in der app.config der Anwendung einen zusätzlichen Settings-Block einfügt (im unteren Beispiel der Bereich ClassLibrary1.Properties.Settings). Diesen kopiert man am besten aus der app.config der Klassenbibliothek. Wichtig ist, dass dieser neue Block noch registriert wird. Dies passiert im Bereich <configSections> mit der Zeile.

    <section name="ClassLibrary1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />

    Sonst erhält man eine Exception, dass die Configuration ungültig ist.

Nun kann man aus der Anwendung heraus auch die Parameter der Klassenbibliothek einstellen. Ich habe das z.B. verwendet um mir die Übergabe von Konfigurationsparametern an die Klassenbibliothek zu ersparen.

Was mir allerdings nicht besonders gut gefällt, ist die Tatsache, dass ich beim hinzufügen von neuen Config-Parametern für die Klassenbibliothek immer daran denken muss, auch in der Anwendung diese hinzuzufügen. Vergesse ich das, erhalte ich zwar keinen Fehler aber es wird einfach mit dem Default-Wert gearbeitet. Das kann manchmal durchaus erwünscht sein, in anderen Fällen ist das aber eher problematisch.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, 
               System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
" >
            <section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, 
               System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
" requirePermission="false" />
            <section name="ClassLibrary1.Properties.Settings" type="System.Configuration.ClientSettingsSection, 
               System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <WindowsApplication1.Properties.Settings>
            <setting name="Setting" serializeAs="String">
                <value>abc</value>
            </setting>
        </WindowsApplication1.Properties.Settings>
        <ClassLibrary1.Properties.Settings>
            <setting name="Setting" serializeAs="String">
                <value>zzzz</value>
            </setting>
        </ClassLibrary1.Properties.Settings>
    </applicationSettings>
</configuration>
Tuesday, June 05, 2007 10:10:06 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [2]    | 
 Wednesday, May 23, 2007

Wird ein Connection-String in der config-Datei abgelegt, sollte man darin das Kennwort verschlüsseln. Der Connection-String sieht dann ungefähr so aus:

Data Source=MeinServer;Persist Security Info=True;User ID=User1;Password=vM17E6mtBos=;Unicode=True

Wenn man den Connection-String nun verwenden möchte, muss man darin das Passort erst einmal finden, entschlüsseln und dann im Connection-String das verschlüsselte Kennwort mit dem entschlüsselten ersetzen. Zum Entschlüsseln habe ich eine kleine Funktion eingesetzt, die einfach die Funktionen aus dem System.Security.Cryptography-Namespace verwendet. Das Suchen des Passworts mache ich dann mit einem RegEx:

private string Decrypt(string _connectionString)
{
    Regex r = new Regex(@"^.*?Password=(?<Password>[^;]*)(;|$)", RegexOptions.IgnoreCase);
    string encrypted = r.Match(_connectionString).Groups["Password"].Value;
    string decrypted = Decrypt(encrypted, key);
    return _connectionString.Replace(encrypted, decrypted);
}

Nachtrag:

OK, OK, auf dieses Post habe ich zum ersten mal seit ich blogge Kommentare bekommen und das gleich dutzendweise. Leider funktioniert die Bestätigungsfunktion für die Kommentare bei meinem Blog momentan nicht, da muss ich mal schauen.

Die meisten Kommentare bezogen sich darauf, dass man die config-Datei ja auch mit .net Bordmitteln einfach verschlüsseln kann. In meinem Fall war aber der Wunsch im Vordergrund, dass nur das Kennwort verschlüsselt werden sollte. Der Server sollte im ConnectionString frei editierbar sein. Und das ist meines Wissens nach mit den Standardmethoden nicht möglich. Gut, das hätte ich vielleicht im Post etwas klarer rausstellen sollen, aber...

Trotzdem hier als Ergänzung ein paar Links, die aus den Kommentaren, die das Thema Verschlüsselung der config-Datei beschreiben.

http://www.primetime-software.de/rouven.haban/PermaLink,guid,603e3d04-c67e-4837-9f9b-bc9fc3a15b9c.aspx

http://aspnet.4guysfromrolla.com/articles/021506-1.aspx

Hoffe damit sind nun alle zufrieden. Eigentlich ist es schon erstaunlich, dass man auf einen "schlechten" Post Antworten ohne Ende bekommt, auf die normalen oder vielleicht den einen oder anderen guten tut sich da gar nichts. Na ja, vielleicht überlege ich mir einfach in Zukunft hin und wieder Murks zu schreiben, ist doch recht interessant zu sehen, wer so alles meine Posts liest.

Wednesday, May 23, 2007 8:08:34 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Thursday, May 10, 2007

Mit der statischen Codeanalyse in VS kann der Quellcode nach verschiedenen Regeln analysiert werden. Es lassen sich auch eigene Regeln erstellen. Beginnt man damit zu arbeiten, ergibt sich die Frage, wie kann man die benutzerdefinierten Regeln und die Einstellung, welche Regeln verwendet werden sollen auf mehrere Projekte und für mehrere Entwickler anwenden.

Dazu ein paar Überlegungen:

1.)     Benutzerdefinierte Regeln können durch Kopieren der entsprechenden DLL-Dateien auf die einzelnen Rechner verteilt werden. Dies kann z.B. über das Login-Script erledigt werden.

2.)     Die Einstellungen welche Regeln aktiviert sind, sind im Projekt hinterlegt. Über die Quellcodeverwaltung nutzen somit alle Entwickler, die das Projekt bearbeiten, die gleiche Einstellung.

3.)     Um die Einstellungen für neue Projekte zu übernehmen bietet sich die Erstellung einer entsprechenden Projektvorlage an, in der die entsprechenden Einstellungen vorgenommen werden. Wird ein neues Projekt auf dieser Vorlage erstellt, so erbt dieses die Einstellungen aus der Vorlage.

Thursday, May 10, 2007 3:25:26 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Wednesday, May 09, 2007

Gruppierungen in Excel sind eine feine Sache. Möchte man allerdings untenstehendes Beispiel gruppieren, ergibt sich ein Problem.

Die Gruppenzeile soll in diesem Fall oben stehen. Standardmäßig geht Excel aber davon aus, dass die unterste Zeile einer Gruppe bei einer eingeklappten Gruppierung übrig bleibt. Damit sieht dann das Resultat in dem Beispiel so aus, dass die Gruppe gar nicht mehr angezeigt wird: