.NET BlogBook veröffentlicht

Auf www.dotnetcasts.com wurde heute die Version 1.0 des .NET BlogBook veröffentlicht. Das .NET BlogBlog enthält alle Weblog Beiträge von Norbert und mir in aufbereiteter Form und steht als PDF Datei zur Verfügung. Es kann somit als offline Nachschlagewerk verwendet werden.

Natürlich wird das.NET BlogBlog in regelmäßigen Abständen – genauer gesagt jedes Quartal – aktualisiert, so dass auch in Zukunft neue Artikel hinzukommen werden.

Den Download und weitere Infos findet man hier.

Build Google IG like AJAX Start Page in 7 days using ASP.NET and AJAX

Bereits vor einiger Zeit hatte ich auf einen sehr guten Artikel von Omar Al Zabir – Core-Architect von PageFlakes.com – hingewiesen. Omar hat einen neuen Artikel mit dem Titel Build Google IG like AJAX Start Page in 7 days using ASP.NET and AJAX veröffentlicht, indem er Schritt für Schritt beschreibt wie man eine Startseite wie Google oder Live.com entwickeln könnte.

Besonders interessant dabei ist, daß er neben ASP.NET AJAX auch die Windows Workflow Foundation und Dlinq verwendet. Das Ergebnis kann man sich unter der URL http://www.dropthings.com/anschauen.

Den Artikel findet man unter der URL http://www.codeproject.com/Ajax/MakingGoogleIG.asp

Mehrere Spalten im DataTextField der DropDownList

Leider ist es nicht möglich in der Eigenschaft DataTextField des DropDownList Controls mehr als eine Spalte anzugeben. Allerdings kann man mit Hilfe eines kleines SQL-Tricks diese Gegebenheit umgehen.

SELECT *, (Name + ' ' + Surname) AS FullName FROM [Persons]

Diese Syntax fasst zwei vorhandene Spalten zusammen und gibt diese unter dem Namen FullName im Ergebnis aus. Eingebaut in das SqlDataSource Control kann diese neue Spalte auch schon verwendet werden.

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="" SelectCommand="SELECT *, (Name + ' ' + Surname) AS FullName FROM [Persons]"></asp:SqlDataSource>
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource1" DataTextField="FullName" DataValueField="ID"></asp:DropDownList>

Das Beispielprojekt kann hier runtergeladen werden.

Autoinkrement-Wert nach INSERT INTO auslesen, die Zweite

Im letzten Beitrag zu diesem Thema zeigte ich kurz auf wie es möglich ist,einen inkrementellen Identitätswert nach einem INSERT auszulesen. Dazu verwendete ich die Konstante @@IDENTITY.

Allerdings ist die Verwendung dieser Konstante nicht immer zu empfehlen, da @@IDENTITY unabhängig des aktuellen Gültigkeitsbereiches arbeitet. Verwendet man z.B. einen Trigger, der nach dem eigentlichen INSERT ein weiteres auf eine andere Tabelle absetzt, erhält man den letzten Identitätswert. In diesem Fall also den Wert des zweiten INSERT.

Mit der Verwendung von SCOPE_IDENTITY() umgeht man dieses Problem, da diese Funktion in abhängigkeit des aktuellen Gültigkeitsbereichs arbeitet.

CREATE PROCEDURE [sp_Test]
(@name [varchar](300))
AS
SET NOCOUNT ON
INSERT INTO [Tabelle1]([name]) VALUES (@name)
SELECT SCOPE_IDENTITY()
SET NOCOUNT OFF
INSERT INTO [Tabelle2] (Tabelle1_ID,[name]) VALUES (SCOPE_IDENTITY(),@name)
GO

Die Anwendung ist ähnlich einfach.

Vielen Dank an Frank Kalis, Floydund Tanja für die Hinweise

Jedem, der mehr zum Thema SQL und SQL-Server wissen möchte, kann ich die Internetseite InsideSQL.de empfehlen.

Zufälligen Datensatz ausgeben

Möchte man einen zufälligen Datensatz aus einer Datenbank-Tabelle anzeigen, kann man dies aufwendig per C# Code lösen. Allerdings gibt es eine viel einfachere Methode direkt per SQL.

SELECT TOP 1 Feld FROM Tabelle ORDER BY NEWID()

Die Anweisung NEWID() generiert einen eindeutigen Wert vom Typ uniqueidentifier. In Verbindung mit einem ORDER BY erhält man nun einen “zufälligen” Datensatz.

Dieses Vorgehen funktioniert ebenfalls unter MySQL, allerdings mit einer etwas abgewandelten Syntax.

SELECT Feld FROM Tabelle ORDER BY RAND() LIMIT 1

Autoinkrement-Wert nach INSERT INTO auslesen

Häufig verwendet man in Tabellen einer Datenbank einen inkrementellen ID-Wert um Datensätze eindeutig zu identifizieren. Möchte man nun diesen ID Wert nach dem INSERT direkt weiterverwenden, drängt sich im ersten Moment die Lösung auf, direkt nach dem INSERT ein SELECT auf die höchste ID abzusetzen und den Wert somit auszulesen.

Verwendet man diese Lösung, läuft man allerdings Gefahr eine falsche ID zu bekommen. Es ist durchaus möglich das zwischen dem INSERT und dem SELECT einer Session, bereits ein weiterer Datensatz einer anderen Session eingefügt wurde.

In diesem Beispiel verwende ich eine Stored Procedure um zwei Datensätze in unterschiedliche Tabellen einzufügen. Die erste Anweisung gibt einen inkrementellen Wert zurück, welcher in der zweiten Anweisung verwendet wird.

CREATE PROCEDURE [sp_Test]
(@name [varchar](300))
AS
SET NOCOUNT ON
INSERT INTO [Tabelle1]([name]) VALUES (@name)
SELECT @@IDENTITY
SET NOCOUNT OFF
INSERT INTO [Tabelle2] (Tabelle1_ID,[name]) VALUES (@@IDENTITY,@name)
GO

Zunächst wird per SET NOCOUNT ON angewiesen, daß die Anzahl der betroffenen Zeilen nicht als Teil des Ergebnis des INSERT INTO zurückgegeben wird. Per INSERT INTO Anweisung wird nun der Datensatz in die erste Tabelle eingefügt. Anschließend wird per SELECT @@IDENTITY der ID-Wert des eingefügten Datensatzes ausgelesen. Die Variable @@IDENTITY enthält immer den zuletzt eingefügten Identitätwert. Nun kann per zweiter INSERT INTO Anweisung der nächste Datensatz eingefügt werden.

Natürlich ist es möglich diese Lösung ohne Stored Procedure zu verwenden, um z.B. die ID direkt im Code weiter zu verwenden.

SET NOCOUNT ON;INSERT INTO [Tabelle1]([name]) VALUES (@name);SELECT @@IDENTITY AS NewID

Die inkrementelle ID wird nun als Feld NewID ausgegeben.

snippetcenter.org – Beta-Test gestartet

Thomas Bandthat heute den Beta-Test für http://www.snippetcenter.org gestartet. Hinter Snippetcenter.org verbirgt sich (oder wird sich zukünftig verbergen) eine Sammelstelle für Code-Snippets jeglicher Sprache oder Technologie.

Viel Spaß beim Hochladen und Testen….

http://blog.thomasbandt.de/PermaLink,guid,584b985a-1780-4cc8-b6d6-23149a3a941d.aspx

SQL Server Web Data Administrator

Es gibt nicht nur den “ASP.Net EnterpriseManager[1]” um per Web-Frontend SQL Server Datenbank zu administrieren, sondern auch den “SQL Server Web Data Administrator[2]” von Microsoft.

[1] http://www.aspenterprisemanager.com/
[2] http://www.microsoft.com/downloads/details.aspx?FamilyID=C039A798-C57A-419E-ACBC-2A332CB7F959&displaylang=en