SQL Statements in MS Visual Basic 2008
SQL Statements in Source Code sind immer so eine Sache, was die Formatierung und den Aufbau betrifft, insbesondere bei (sehr) langen Statements.
Die einen nutzen den StringBuilder, um es zeilenweise aufzubauen. In Visual Basic gibt es noch die Alternative, mittels der Zeilenfortsetzung-Zeichen (was man sich in C# sparen kann) den String zu konkatenieren. Das ist aber auch nicht so ohne: Wenn man das Statement im Management Studio erarbeitet + getestet hat, kopiert man es in Visual Studio und darf es überarbeiten, also alles in Anführungszeichen setzen und sie eben zu verbinden. Will man irgendwann mal wieder mit dem Statement in SSMS zurück, muss man dort wieder die Anführungszeichen etc. wieder entfernen.
Mit Microsoft Visual Basic 2008 gibt es die Möglichkeit im Source Code XML direkt zu erfassen, also nicht als String, und das kann man für SQL Statements etwas „zweckentfremden“: Man erfasst ein einfaches Tag und schreibt das SQL Script als Inhalt rein:
Module SqlString Sub Main() 'Der klassische Weg: Als String konkateniert mit Zeilenfortsetzung Dim sql As String sql = "SELECT [AddressLine1] " & _ ",[AddressLine2] " & _ ",[City] " & _ ",[PostalCode] " & _ "FROM [AdventureWorks].[Person].[Address] " & _ "WHERE [AddressID] = @addressId" 'Als implizites XML; ermöglicht es, das Statement direkt aus 'SSMS hierein und wieder zurück zu kopieren Dim xml xml = <sql> SELECT [AddressLine1] ,[AddressLine2] ,[City] ,[PostalCode] FROM [AdventureWorks].[Person].[Address] WHERE [AddressID] = @addressId </sql> 'Klassisch kann man den String "as it" verwenden Console.WriteLine(sql) 'XML Objekt als String ausgeben und die Tags abschnippel 'dazu muss der Tag aber immer gleich (lang) sein Console.WriteLine(xml.ToString.Substring(6, xml.ToString.Length - 12)) 'Aufwendiger über XML Objekt, dafür flexibler und sicherer Dim doc As New Xml.XmlDocument doc.LoadXml(xml.ToString) Console.WriteLine(doc.FirstChild.InnerText) doc = Nothing 'Warte auf Key Console.ReadKey() End Sub End Module
Nun kann man bequem das Statement aus SSMS heraus und ebenso wieder zurück kopieren, ohne etwas ändern zu müssen. Dynamisch zusammen gestelltes SQL ist so nicht möglich, aber wir arbeiten ja eh immer brav & artig mit Parameter, gelle?
Das Handling ist etwas aufwendiger als über reinen String, hält sich aber in Grenzen.
Was mir nicht so gefällt sind die vielen Leerzeichen. Zwar stören sie nicht, aber sie sind ja nun unnötig und stellen zusätzlichen Traffic für die Übertragung dar; nicht viel, aber Kleinvieh mach auch Mist, vor allem wenn es häufig ausgeführt wird.
Das Ergebnis sieht so aus:
SELECT [AddressLine1] ,[AddressLine2] ,[City] ,[PostalCode] FROM [AdventureWorks].[Person].[Address] WHERE [AddressID] = @addressId SELECT [AddressLine1] ,[AddressLine2] ,[City] ,[PostalCode] FROM [AdventureWorks].[Person].[Address] WHERE [AddressID] = @addressId