Kalender
<<  Dezember 2014  >>
MoDiMiDoFrSaSo
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234
blettner , eingetragen am 16. Dezember 2008, 12:48

Gestern wurde still und heimlich das Service Pack 3 vom SQL Server 2005 veröffentlicht.

Downloaden kann man das Packet hier. Welche Änderungen vorgenommen wurden, kann man hier nachlesen.

Der Linq2SQL Designer im Visual Studio bietet einem einfach und schnell Datebankanbindugen zu generieren. Leider hat dieser eine Schwachstelle, die zwar während der Entwicklung nicht stört, einem jedoch das Leben erschweren kann wenn man zwischen Entwicklungs- und Produktiv- Betrieb wechselt. Im Grunde geht es dabei um etwas so einfaches wie den Connectionstring zur Datenbank. Dieser wird in einem Resource File abgelegt und kann dadurch zur Laufzeit nicht mehr verändert werden. Die Konfiguration mittels dem App.config Files ist somit nicht möglich und der Entwickler muß diesen vor jedem Deployment anpassen.

Eine Möglichkeit, den Connectionstring zur Laufzeit anzupassen, möchte ich hier zeigen.

app_settings

Als Beispiel nehme ich zwei Tabellen aus der Northwind Datenbank. Diese werden mittels des Linq2SQL Designers vom Server Explorer in das Fenster gezogen. Die erste Änderung die vorzunehmen ist, ist dass man in den Connection Einstellungen die Applikation Settings auf “false” setzt. Erst jetzt kann der Connectionstring angepasst werden (zuvor wären Systemeinstellungen die im settings File gespeichert wurden verwendet).

Wenn man nun das Design File der dbml Datei öffnet (in diesem Fall DataClasses.designer.cs) sieht man folgendes:

code_comment

Es wird ein eigener Konstruktor angelegt, der es einem ermöglicht einen eigenen Connectionstring anzugeben. Problem hier ist aber, jedes mal wenn im Designer etwas geändert wird, wird diese Klasse angepasst und sämtliche Änderungen gehen verloren. Um dem Vorzubeugen und nicht immer alles neu machen zu müssen, ist es ratsam eine eigene Klasse anzulegen die diesen Konstruktor enthält. Jener im .design.cs File kann indessen auskommentiert werden (das ist der einzige Schritt der auch nach eine Änderung im Designer wieder durchzuführen ist).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
 
namespace LINQ2SQL_DataSource_Configuration {
    public partial class DataClassesDataContext {
        public DataClassesDataContext() :
            base(MyConnectionStringProperty) {
            OnCreated();
        }
    }
}

Der Rest ist relativ simpel. Es wird eine weitere partielle Klasse der DataContext Klasse angelegt, in dessen Konstruktor die eigene Methode zum auslesen des Connectionstrings aufgerufen wird (kann aus einem eigenen Settings File kommen, aus dem App.config, aus der Registry usw.).

Wie man sieht kann man sich relativ einfach helfen um auch dieses Problem alltagstauglich zu lösen.

blettner , eingetragen am 26. November 2008, 11:35

Queries dynamisch zu erstellen wird einem immer wieder unter kommen. Solange es sich um reine SQL Statements handelt, kann man sich mit dem Zusammenbau eines Strings helfen, der dann letztendlich an das Command Objekt übergeben wird.

objCommand.CommandText = "SELECT server_id, " +
"server_name, " +
"server_version, " +
"FROM tbl_servers " +
  if (blSql2005Up)
      objCommand.CommandText += 
"WHERE server_version >= 2005";
 

Als Beispiel eine Query, welche aus einer Tabelle entweder alle dort gespeicherten SQL Server ausliest oder jene, bei denen die Server Version größer/gleich 2005 ist.

Wie kann man das nun mit LINQ bewerkstelligen? Wenn man folgende Query betrachtet an sich sehr ähnlich!

var ServerList = from p in tbl_Servers
orderby p.Name ascending
select p;
  if (blSql2005Up)
             ServerList = ServerList.Where(
server => server.server_version >= 2005
);

Sämtliche LINQ Query Ergebnisse (solange sie vom Type IEnumerable sind) können nachträglich mittels Lambda Expressions weiter bearbeitet werden. Sei es um die Sortierung zu ändern oder das Ergebnis weiter einzuschränken.

blettner , eingetragen am 18. November 2008, 14:15

Kürzlich stand ich vor dem Problem aus eine Applikation einen SQL Syntax Check durchführen zu wollen, so wie man ihn aus dem SQL Server Management Studio kennt.

Wie funktionierts?
Am Einfachsten mit den SQL Server Managemet Objekten. Wenn keine lokale SQL Server Installation vorhanden ist, kann man diese auch als Teil des SQL Server Feature Packs downloaden (SQL Server Feature Pack Oktober 2008 download).

Sind diese installiert, muß man zunächst folgende Referenzen zum Projekt hinzufügen (die hier aufgelisteten Referenzen beziehen sich auf die SMO Objekte vom SQL Server 2008):

  • Microsoft.SqlServer.ConnectionInfo
  • Microsoft.SqlServer.Management.Sdk.Sfc
  • Microsoft.SqlServer.Smo

Jetzt stehen die nötigen Objekte zur Verfügung um eine Verbindung zum SQL Server herstellen zu können.

Server server = new Server(@".\SQLEXPRESS");
server.ConnectionContext.DatabaseName = "DataBaseForCheck";
server.ConnectionContext.Connect();
	

Zuerst wird ein Serverobjekt angelegt, das die Verbindung zu einer SQL Instanz herstellt.

try {
     intRS = objSQLServer.ConnectionContext.ExecuteNonQuery(
	         strScriptToCheck, ExecutionTypes.ParseOnly
             );
} catch (Exception ex) {
	//Fehlerbehandlung durchführen
} 

Der wirkliche Check passiert nun beim ausführen des Scripts mittels ExecuteNonQuery, wobei man hier noch die Option “ParseOnly” als Execution Typ angibt. Im Falle eines Syntaktischen Fehlers, wird eine Exception geworfen.

Wichtig hierbei ist, dass nur ein Syntaktischer Check durchgeführt wird. Es wird nicht überprüft ob Spalten oder Tabellen die in diesem Script angegeben sind wirklich vorhanden sind!

blettner , eingetragen am 17. November 2008, 11:46

Vor ca. einem Monat wurde Silverlight 2.0 released und es hat geheissen, dass es zur oder nach der PDC ein Toolkit geben sollte, dass weitere Controls enthält.

Dieses ist nun erschienen und kann hier downgeloadet werden: http://www.codeplex.com/Silverlight/Release/ProjectReleases.aspx?ReleaseId=18804

Einen Überblick, welche Controls darin enthalten ist bekommt man hier: http://blogs.msdn.com/sburke/archive/2008/10/28/silverlight-toolkit-now-available-for-download.aspx

blettner , eingetragen am 8. November 2008, 13:15

Im SP1 von Visual Studio 2008 wurde ein neues Feature in C# eingeführt, welches einem sofort Fehler anzeigt ohne kompilieren zu müssen.

Für dieses Feature gibt es nun einen Bugfix, da in manchen Fällen Fehler angezeigt wurden die in Wirklichkeit keine waren. Genaueres und der Download auf dieser Seite: http://blogs.msdn.com/webdevtools/archive/2008/10/31/downloadable-hotfix-incorrect-c-compilation-errors-for-asp-net-code-behind-files-in-sp1.aspx