Overblog
Folge diesem Blog Administration + Create my blog
Blog von Olaf Helper

Visual Studio 2010 and .NET Framework 4 Training Kit

20. Mai 2009 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

Die Beta Version von Microsoft Visual Studio 2010 wurde ja bereits veröffentlicht, nun gibt es auch noch dazu das Visual Studio 2010 and .NET Framework 4 Training Kit  zum Download.

Weiterlesen

Insert und Update Timestamp für MS Sync Framework

20. Mai 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

 

Wer sich schon mal mit dem Microsoft Sync Framework für .NET beschäftigt hat, weiß das man für eine Batch Synchronisation in den Tabellen mindestens zwei Timestamp-Felder benötigt; eins für Insert und eins für Update.

Natürlich kann man in einer Tabelle nicht 2 oder mehr Felder mit Typ Timestamp anlegen; macht ja auch keinen Sinn, da bei jedem Update alle Felder auf das gleiche aktuelle Timestamp gesetzt werden würde.

Im MS SQL Server ist das mit einem einfachen Kniff leicht möglich, ohne eine Programmanpassung vornehmen zu müssen. Für Update legt man ein Feld mit Typ Timestamp an, für Insert ein Feld vom Typ Binary(8), bei dem das Default auf @@DBTS +1 gesetzt wird. Natürlich weist man dem Feld nie ein Wert zu, sondern belässt man den Default; also dem Timestamp zu Zeitpunkt des Inserts.

Sieht dann so aus:

 

 USE tempdb  
 --TempDB um mit @@DBTS die richtigen Werte zu bekommen 
 GO 
 CREATE TABLE #TS 
  (Id int identity(1,1), 
   UpdateTS timestamp, 
   InsertTS binary(6) DEFAULT @@DBTS + 1); 
   
 -- 3 Datensätze zur Demo 
 INSERT INTO #TS DEFAULT VALUES; 
 INSERT INTO #TS DEFAULT VALUES; 
 INSERT INTO #TS DEFAULT VALUES; 
 -- Einen davon Updaten 
 UPDATE #TS 
 SET InsertTS = InsertTS 
 WHERE Id = 3 
 -- Wie sieht es aus? 
 SELECT * FROM #TS; 
 -- ... gut 
 GO 
 DROP TABLE #TS 

 

Ergebnis:

 

 Id UpdateTS InsertTS 
 ----------- ------------------ -------------- 
 1 0x000000000000401C 0x00000000401C 
 2 0x000000000000401D 0x00000000401D 
 3 0x000000000000401F 0x00000000401E 

 

Wie erwartet und gewünscht.

 

Nun möchte ich das Ganze mit einer MS SQL Server Compact Editon 3.5 SP1 Datenbank nutzen.

Wenn man zur Tabellen-Anlage das SQL Server Management Studio nutzt, fällt einen zunächst mal auf, das im SQL Server CE der Datentyp nun RowVersion statt Timestamp heißt; sehr positiv, wie ich finde, den Timestamp ist irreführend, das es nichts mit Datum – Uhrzeit zu tun hat; es ist nur eine fortlaufende Nummer und RowVersion ist die wesentlich passendere Bezeichnung; bleibt zu Hoffen, dass die Bezeichnung dann demnächst auch im SQL Server Einzug hält; vielleicht schon mit SQL Server 2008 R2? Beim CREATE TABLE kann man sowohl Timestamp als auch RowVersion verwenden; ich verwende mal zu Demo-Zwecken letzteres.

 

Hier also das Script für SQL Server CE 3.5; man muss aber jeden Befehl einzeln im SSMS ausführen, da keine Batches unterstütz werden. Das bei @@DBTS das + 1 fehlt, liegt daran, das beim ersten Test ein falscher (um eins zu hoher) Wert raus kam … aber das kommt noch.

 

 -- Bei CE jeden Schritt einzeln abarbeiten!! 
 CREATE TABLE TS 
  (Id int identity(1,1), 
   UpdateTS rowversion, 
   InsertTS binary(8) DEFAULT @@DBTS); 
   
 -- 3mal einzeln ausführen, bitte! 
 INSERT INTO TS (UpdateTS) VALUES(NULL); 
   
 -- Einen davon Updaten 
 UPDATE TS 
 SET InsertTS = InsertTS 
 WHERE Id = 3 
   
 SELECT * FROM TS; 
   
 GO 
 DROP TABLE TS 

 

Ergebnis:

 

 Id UpdateTS InsertTS 
 ----------- ------------------ ------------------ 
 1 0x000000000000003F 0x000000000000003F 
 2 0x0000000000000040 0x000000000000003F 
 3 0x0000000000000042 0x000000000000003F 

 

Ähem, ja; es funktioniert … fast so irgendwie. Es hat den Anschein, dass zum Zeitpunkt der Tabellenanlage die Funktion @@DBTS aufgelöst und danach nur noch dieser Wert verwendet wird, nicht der aktuelle. Das ist natürlich suboptimal. Hilft also alles nichts, man muss sein Insert-Statement anpassen in der Form:

 

INSERT INTO TS (InsertTS) VALUES(@@DBTS + 1);

 

Hier also doch wieder @@DBTS + 1.

Ergebnis:

 

 Id UpdateTS InsertTS 
 ----------- ------------------ ------------------ 
 1 0x000000000000003F 0x000000000000003F 
 2 0x0000000000000040 0x000000000000003F 
 3 0x0000000000000042 0x000000000000003F 
 4 0x0000000000000043 0x0000000000000043 
 5 0x0000000000000044 0x0000000000000044 

 

Was sagt uns das? Immer alles ausgiebig testen, auch wenn es zunächst augenscheinlich funktioniert.

Weiterlesen

Microsoft SQL Server "Kilimanjaro" - Der Film

20. Mai 2009 , Geschrieben von Olaf Helper Veröffentlicht in #MSSQL

Microsoft SQL Server Kilimanjaro - Der Film
Als Stummfilm mit Buster Keaton in der Hauptrolle; selbstverständlich neben Microsoft SQL Server Kilimanjaro (SQL Server 2008 R2)

Nett gemacht, Silverlight ist Voraussetzung. Das Laden dauert aber etwas ...
Leider gibt es keine Controls zum für Stop/Pause/Play; also besser Handy & Co stumm schalten, damit komplett ungestört geniessen kann.

Ich liebe Slapstick ...

Weiterlesen

Microsoft SQL Server 2008 R2

15. Mai 2009 , Geschrieben von Olaf Helper Veröffentlicht in #MSSQL

Auf der Microsoft tech-ed 2009 wurde es wohl angekündigt, jetzt gibt es auch eine öffentliche Info zum SQL Server 2008 R2.
Interessant hört sich "Master Data Services (MDS)" an, es soll eine zentrale Verwaltung von Stammdaten ermöglich; weitere Details kann man auf der Seite nachlesen. So soll auch bereits Teile der für 
SQL Server „Kilimanjaro“ Feature enthalten sein.
Auf der Seite kann man sich auch registrieren, um eine Benachrichtigung über ein Release einer CTP - Comunity Technologie Preview zu erhalten.

Weiterlesen

SQL Server 2008 Developer Training Kit

13. Mai 2009 , Geschrieben von Olaf Helper Veröffentlicht in #Download MSSQL

Microsoft hat das "SQL Server 2008 Developer Training Kit" veröffentlicht. Es richtet sich in erster an Web Entwickler und behandelt vor allem die Neuerungen vom SQL Server wie die neuen Datentypen oder Filestream und wie man sie für seine Web Applikationen nutzen kann.
Voraussetzung sind der SQL Server 2008 und Visual Studio 2008 (Web), bei beiden reichen die kostenfreie Express Editions, sowie eine AdventureWorks Beispieldatenbank. 

Weiterlesen

Kurzschlussoperation AndAlso / OrElse

11. Mai 2009 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

Mit MS Visual Basic.NET wurden bekanntlich auch einige neue Sprachkontrukte eingeführt. Einige davon sind klein, unscheinbar und kaum erwähnt, aber dafür ungemein praktisch. Wie ich finde gehören dazu die "Kurzschlussoperation" AndAlso und OrElse; komisch eingedeutsche Bezeichnung, erleichter einem aber bestimmte Fallunterscheidungen. 
Bei einer logisch And-Verknüpfung in einer Fallunterscheidung werden immer alle Teile ausgewerte, auch wenn der erste schon fehlschlägt; wegen And kann es ja kein positive Ergebnis ergeben, trotzdem werden die weiteren Ergebnisse ermittelt; das ist nicht performant. 
Bekannter Fall ist auch eine Prüfung auf DivisionByZero: Man muss erst die Werte prüfen und dann noch in einer weiteren Fallunterscheidung, ob eine Divison ein bestimmtes Ergebnis liefert.
Mit AndAlso kann man das nun abkürzen, siehe hier

 
Module
TestConsole
   
  Sub Main()  
   
  Dim val1 As Integer = 1, val2 As Integer = 0  
   
  'Prüfung mit AND  
  'Try/Catch, weil ich schon weiß, das es schief geht (DivByZero)  
  Try  
  If val2 <> 0 And (val1 \ val2) = 1 Then  
  Console.WriteLine("Erstes IF erreicht")  
  Else  
  Console.WriteLine("Erstes ELSE erreicht")  
  End If  
  Catch ex As Exception  
  Console.WriteLine(ex.ToString)  
  End Try  
   
  'Prüfung mit dem Kurzschlussoperation "AndAlso"  
  'Der erste Vergleich auf <> 0 schlägt fehl, dadurch  
  'wird der zweite erst gar nicht ausgewertet. Otimal!  
  If val2 <> 0 AndAlso (val1 \ val2) = 1 Then  
  Console.WriteLine("Zweites IF erreicht")  
  Else  
  Console.WriteLine("Zweites ELSE erreicht")  
  End If  
   
  'MSDN: AndAlso  
  'http://msdn.microsoft.com/de-de/library/cb8x3kfz(VS.80).aspx  
  'MSDN: OrElse  
  'http://msdn.microsoft.com/de-de/library/ea1sssb2(VS.80).aspx  
   
  'MSDN: Logische und bitweise Operatoren in Visual Basic  
  'http://msdn.microsoft.com/de-de/library/wz3k228a(VS.80).aspx  
  End Sub  
   
 End Module  

Weiterlesen

Ziffern in Worten fassen

8. Mai 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Zahlen sind das einzig ware, eindeutiger geht es nicht und eigentlich gibt es keine subjektive Interpretation, höchsten eine kontextuelle.

Machmal braucht man aber auf Print-Outs die Zahl als Wort. Hier eine T-SQL Scriptfür den MS SQL Server, das zumindest eine ganz einfache Variante realisiert: Es setzt jede einzelne Ziffer in ein Wort um.
Die z.B. für Scheck-Aufdrucke benötigte Zahlenbezeichnung ist es nicht, aber die kommt noch .. da muss ich noch etwas basteln.

 
IF
OBJECT_ID (N'dbo.fnDigitsAsWord', N'FN') IS NOT NULL
  DROP FUNCTION dbo.fnDigitsAsWord; 
 GO 
   
 CREATE FUNCTION dbo.fnDigitsAsWord(@Num numeric(38, 2), @separator varchar) 
  RETURNS varchar(4000) 
 AS 
 -- Autor: Olaf Helper 
 -- Stand: 08.05.2009 
 -- Typ: User Defined Function 
 -- Name: fnDigitsAsWord 
 -- Gibt für eine Zahl die einzelnen Ziffernwörter aus 
 -- wobei als Trenner der übergebene Paramter verwendet wird 
 BEGIN 
  DECLARE @text varchar(4000); 
  DECLARE @loop int; 
  DECLARE @result varchar(4000); 
  DECLARE @part char; 
   
  IF NOT (@Num IS NULL) 
  BEGIN 
  SET @text = CONVERT(varchar(4000), @Num); 
  SET @result = ''; 
  SET @loop = 1; 
   
  WHILE @loop <= LEN(@text) 
  BEGIN 
  SET @separator = ISNULL(@separator, ' '); 
  SET @part = SUBSTRING(@text, @loop, 1); 
   
  -- Ziffernwörter aufbauen 
  SET @result = @result + 
   CASE @part WHEN '-' THEN 'Minus' 
   WHEN '.' THEN 'Komma' 
   WHEN '0' THEN 'Null' 
   WHEN '1' THEN 'Eins' 
   WHEN '2' THEN 'Zwei' 
   WHEN '3' THEN 'Drei' 
   WHEN '4' THEN 'Vier' 
   WHEN '5' THEN 'Fünf' 
   WHEN '6' THEN 'Sechs' 
   WHEN '7' THEN 'Sieben' 
   WHEN '8' THEN 'Acht' 
   WHEN '9' THEN 'Neun' 
   END; 
  SET @result = @result + @separator; 
  SET @loop = @loop + 1; 
  END; 
  --Letzten Separator entfernen; Vergleich mit Sep = Space 
  -- geht sonst nicht 
  IF RIGHT(@result, 1) = @separator AND @separator <> ' ' 
  SET @result = LEFT(@result, LEN(@result) - 1); 
   
  END; 
   
  RETURN(@result); 
  END; 
  GO 
   
 -- Unit-Test  
 SET NOCOUNT ON; 
 SELECT dbo.fnDigitsAsWord(NULL, '#') AS Word UNION 
 SELECT dbo.fnDigitsAsWord(1.23456789000, '*') UNION 
 SELECT dbo.fnDigitsAsWord(12345.6789123400, ' ') UNION 
 SELECT dbo.fnDigitsAsWord(123456789.123400, '-') UNION 
 SELECT dbo.fnDigitsAsWord(00.0100, '-'); 
 GO

Ergebnis:



Word
----------------------------------------------------
NULL
Eins Zwei Drei Vier Fünf Komma Sechs Acht
Eins*Komma*Zwei*Drei
Eins-Zwei-Drei-Vier-Fünf-Sechs-Sieben-Acht-Neun-Komma-Eins-Zwei
Null-Komma-Null-Eins

 



Weiterlesen

Eckdaten der aktuellen SQL Server Verbindungen

8. Mai 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Hat man viele Clients, viele Datenbanken von Fremanbietern, viele Services ... eben vieles auf seinem Microsoft SQL Server am Laufen, dann ist es mehr als nur interessant, die ganzen aktiven Verbindungsdaten zu sehen.
Gerade wenn es auch um Trouble-Shooting oder die Analyse geht, sind diese Daten wichtig. Treten Probleme vielleicht nur in einem IP Segment auf, oder nur mit bestimmten Spracheinstellung auf; oder nur eine bestimmte Zugriffskomponente verwendet wird; ODBC ist so ein etwas sehr betagter Kandidat. 
Die Dynamic Views sys.dm_exec_connections und sys.dm_exec_sessions liefern dazu die benötigten Daten. Wenn etwas fehlt, das folgende SQL Statement einfach im SELECT um ein einfaches ,* erweitern.

 -- Selektion der aktuellen Verbindungen 
 -- mit den interessanten Eckdaten 
 SELECT poi.name AS ConnectionTyp, 
  con.net_transport, con.protocol_type, 
  con.client_net_address, 
  ses.host_name, ses.program_name, 
  ses.client_interface_name, 
  ses.login_name, ses.language 
 FROM sys.dm_exec_connections AS con 
  INNER JOIN sys.endpoints AS poi 
  ON con.endpoint_id = poi.endpoint_id 
  INNER JOIN sys.dm_exec_sessions as ses 
  ON con.session_id = ses.session_id 
 ORDER by ses.session_id 
Weiterlesen