SQL Server & ASP .NET Blog

Interessantes und Wissenswertes

Git–neue Remote Branches erscheinen nicht in Visual Studio

Szenario: Ein Kollege hat einen neuen Branch angelegt und publiziert
Problem: Der Branch erscheint nicht in Visual Studio

Lösung:

Schritt 1 – Drittanbietertools installieren

http://msdn.microsoft.com/de-de/library/dd286572.aspx#setup_open

Schritt 2 – Konsole öffnen

16_konsole

Schritt 3 – Fetch und checkout

In der Konsole das aktuelle Repository holen “git fetch” und danach den neuen Branch auschecken mit dem Befehl “git checkout –b <branchname> origin/<branchname>” .

Daraufhin erscheint dieser auch im Visual Studio.

XML Dateien mit Visual Studio formatieren

In Visual Studio ist es ein Kinderspiel “hässliche” automatisch generierte einzeilige XML-Dateien in der Form:

<root><element>text</element><element>text2</element></root>

mit einem Hotkey in ein lesbares Format zu bringen.

[STRG] + [K] – [D] – also Steuerung halten und dann [K], dann [D]

Ergebnis ist:

<root>
    <element>text</element>
    <element>text2</element>
</root>

Textdateien durchsuchen - mit Visual Studio

Problem Teil 1: Man hat eine Masse an Textdateien und möchte diese durchsuchen
Problem Teil 2: Diese Dateien haben keine *.txt Endung und wurden nicht von Windows indexiert => Windows-Suche fällt also aus
Problem Teil 3: Man kann die Dateien nicht vom Remote-Rechner kopieren und auf dem Remote-Rechner auch keine Software installieren

Mein Glück: Visual Studio ist installiert

Lösung: Neues Projekt in Visual Studio öffnen, alle Dateien hinzufügen => Visual Studio interne Suche über "Entire Solution" verwenden :-)

Visual Studio – Quelltext während Debuggen bearbeiten

Um den Quelltext einer Anwendung während des Debuggens zu bearbeiten, muss “Edit and Continue” aktiviert werden. Dies geht für Webanwendungen an zwei (!!) Stellen. Einerseits bei den Optionen und andererseits in den Projekteigenschaften unter “Web”. (Die Bearbeitung funktioniert allerdings erst, sobald der Code an einem Haltepunkt angekommen ist).

image

image

SQL CLR Integration – Test

Eine kurze Erweiterung zum letzten Artikel: siehe [hier]

Möchte ich die erstellte Funktion testen und debuggen, dann kann ich das auch direkt aus dem Visual Studio heraus. Dazu gibt es im erstellten Projekt eine bereits vorhandene Test.sql, die dazu dienen soll eigene Funktionen etc. auszuführen, zu testen und zu debuggen.

image

Mit Rechtsklick auf die Test.sql und “Set as default debug script” wird dieses Skript immer beim Debuggen ausgeführt.

image

Nun kann ich im Skript meine Funktion ausführen und ein paar Tests durchführen. Beispiel:

IF dbo.fDNSCheck('MyDNSName') = 1
PRINT 'OK'
IF dbo.fDNSCheck('NotMyDNSName') = 0
PRINT 'OK'  

Dazu muss auf dem SQL Server allerdings der Remote Debugger installiert sein (msvsmon.exe). Weitere Informationen dazu gibt es [hier]Außerdem müssen einige Berechtigungen als Voraussetzung vorhanden sein (siehe ebenso der Link). Sind alle Voraussetzungen vorhanden, dann kann per F5 das Skript gestartet werden, es können Haltepunkte im .NET Code gesetzt werden etc.

SQL CLR Integration - .NET Code im SQL Server

Der SQL Server bietet die Möglichkeit CLR-Code direkt auszuführen und somit erweiterte Funktionen zu erfüllen. Ein kleines Beispiel: Ich möchte prüfen, ob mein SQL Server auf einen bestimmten DNS-Namen im Netzwerk hört. Dazu ist mir mit Bordmitteln keine Möglichkeit bekannt.

Zunächst einmal muss die CLR-Integration aktiviert werden.

sp_configure 'clr_enable', 1
RECONFIGURE

Ergebnis ist:

Configuration option 'clr enabled' changed from 0 to 1. Run the RECONFIGURE statement to install.

Jetzt können wir loslegen. Ich erstelle im Visual Studio ein neues Datenbankprojekt und nenne es DNSChecker:

image

Im darauf folgenden Dialog muss eine Verbindung zu einer Datenbank hergestellt werden (die Datenbank, in der die Assembly letztendlich liegen soll und aus der sie ausgeführt wird).

image

Nachdem die Verbindung eingetragen ist, habe ich über einen Rechtsklick auf das Projekt und “Add” die Möglichkeit verschiedene Objekte zu erstellen:

image

Die einzelnen Möglichkeiten sind:

  • User-Defined Function – Eine Funktion mit Eingabeparametern und einem Ausgabeparameter
  • Stored Procedure – Ähnlich einer T-SQL Prozedur
  • Aggregate – Eine Aggregatfunktion, wie SUM(), AVG() etc.
  • Trigger – Ein CLR Trigger
  • User-Defined Type – Ein eigener “Datentyp”

Für das Beispiel beschränke ich mich auf das Erstellen einer Funktion, die mir nach Eingabe eines DNS-Namens zurückgibt, ob mein Server auf diesen Namen hört, oder nicht. Also => User-Defined Function

Nach Erstellen der Funktion erhalte ich einen bereits funktionsfähigen Rumpf mit einer Art “Hello World”.

public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString fDNSCheck()
{
// Put your code here
return new SqlString("Hello");
}
};

Würde ich die Funktion nun aufrufen würde ich ganz einfach “Hello” als Ergebnis erhalten. Ich möchte allerdings “wahr” oder “falsch” als Bit-Wert zurückgeben und benötige als Eingabeparameter noch einen string (den DNS-Namen)

public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlBoolean fDNSCheck(string sDnsName)
{
// Put your code here
return new SqlBoolean(false);
}
};

 

 

Nun fehlt noch die eigentliche Überprüfung, ob der Server auf den Namen hört.

[Microsoft.SqlServer.Server.SqlFunction]
public static SqlBoolean fDNSCheck(string sDnsName)
{
bool result = false;
try
{
//Get all ips for DNS-Name
IPHostEntry ip = Dns.GetHostEntry(sDnsName);
IPAddress[] IpA = ip.AddressList;
//check if a local ip for this name exists
foreach (IPAddress ipDNS in IpA)
{
foreach (IPAddress ipLocal in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
if (ipDNS.ToString() == ipLocal.ToString())
{
result = true;
}
}
}
}
catch (Exception ex)
{
result = false;
}
return new SqlBoolean(result);
}

Dazu iteriere ich über alle für den DNS-Namen gefundenen IP-Adressen und vergleiche mit allen auf dem Server gefundenen IP-Adressen. Wird eine Übereinstimmung gefunden wird “true” zurück gegeben. Nun ist die Funktion fertig und könnte arbeiten. Da die Funktion allerdings die Berechtigungsstufe “unsafe” benötigt (näheres siehe unter http://technet.microsoft.com/de-de/library/ms131071.aspx) muss die Datenbank in der diese laufen soll die Eigenschaft “TRUSTWORTHY ON” haben. Also…

ALTER DATABASE CLRTestDB SET TRUSTWORTHY ON

…und für die Assembly muss eingestellt werden, dass der Zugriff in der Stufe “unsafe” erfolgen soll (in den Projekteigenschaften).

image

Nun kann ich die Assembly per “Deploy” auf dem Server installieren. Führe ich die Funktion nun aus und mein Server hört z.B. auf den Namen “MyDNSName”, dann gibt die Funktion “1” für “wahr” zurück.

image

Dieses kleine Beispiel hat gezeigt, wie einfach es ist den SQL Server mit eigenen .NET Funktionen zu erweitern.

Visual Studio (C#) – Fehlende Using-Direktiven (halb)automatisch einfügen

Ein kleiner Tipp. Teilweise tippt man munter drauf los, ohne vorher die benötigten “using” Direktiven anzugeben. Visual Studio merkt das und unterstreicht die verwendete Klasse rot.

sqlcon

Nun kann man – entweder die using-Direktive manuell eingeben, oder – man drückt [STRG] + [.] und ein Kontextmenü klappt auf und die Direktive kann direkt automatisch eingebunden werden.

sqlcon2

Funktioniert mit Visual Studio 2008 und 2010 (ob es in 2005 schon ging, habe ich nicht getestet).

Fehler beim Erstellen des Steuerelements ...

Beim Öffnen einer Website in Visual Studio kann es vorkommen, dass einige Steuerelemente nicht korrekt angezeigt werden können.

Die Fehlermeldung (als Beispiel): "Fehler beim Erstellen des Steuerelements: <Elementname> asp:UpdatePanel konnte nicht für die ContentTemplate-Eigenschaft festgelegt werden." erscheint.

Woher diese Fehlermeldung kommt, weiß ich leider (noch) nicht. Auf jeden Fall kann Sie behoben werden: Einfach das Projekt schließen und alle Dateien in "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files" löschen und danach das Projekt wieder öffnen.

Eine weitere Möglichkeit soll sein diese Verzeichnis zu leeren: C:\Dokumente und Einstellungen\<USERNAME>\Lokale Einstellungen\Anwendungsdaten\Microsoft\VisualStudio\9.0\ProjectAssemblies (hat bei mir nicht funktioniert)