Boolschen Rückgabewert einer Stored Procedures in C#

Ich hatte mir eine Stored Procedure erstellt, welche überprüft, ob es schon einen bestimmten Eintrag in der Datenbank gibt. Sie sollte mir also nur ein true oder false zurück liefern.

ALTER PROCEDURE dbo.LineExists	
	(
	@name nvarchar(100)	
	)	
AS BEGIN
	IF(EXISTS(Select [Name] FROM DemoTable WHERE [Name] = @name))
		RETURN(1)
	ELSE
		RETURN(0)
END

Meine passende C# Funktion sah in etwa so aus:

SqlConnection sqlConn = new SqlConnection(this.connstring);
SqlCommand sqlCom = new SqlCommand("LineExists", sqlConn);
sqlCom.CommandType = CommandType.StoredProcedure;
sqlCom.Parameters.Add("@name", SqlDbType.NVarChar).Value = "TestLeine";

sqlConn.Open();
bool vorhanden = ((int)sqlCom.ExecuteScalar() == 1) ? true:false;

Das führte immer zu einer Null-Reference-Exception. Auch der Weg über einen SqlDataReader funktionierte nicht. Eine Möglichkeit wäre, die Stored Procedure anzupassen und statt „Return(0)“ „Select 0“ zurück zu geben. Dann würde der obere Code auf jeden Fall funktionieren.

Andere Möglichkeit wäre, den Return Value auszulesen. Dazu muss man dem SqlCommand einen Parameter mitgeben, welchen ihr nach der SQL Operation wieder auslest. Kurzes Code-Beispiel:

SqlConnection sqlConn = new SqlConnection(this.connstring);
SqlCommand sqlCom = new SqlCommand("LineExists", sqlConn);
sqlCom.CommandType = CommandType.StoredProcedure;
sqlCom.Parameters.Add("@name", SqlDbType.NVarChar).Value = "TestLeine";
sqlCom.Parameters.Add("RETURN_VALUE", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

sqlConn.Open();
sqlCom.ExecuteNonQuery();
bool vorhanden = ((int)sqlCom.Parameters["RETURN_VALUE"].Value == 1) ? true:false;

Beide liefern das selbe Ergebnis. Pro oder Contra habe ich bei einer spontanen Google-Recherche nicht gefunden, ist sicherlich Geschmackssache.

ADO.NET: Feld ausschließen

Als ich den letzten Beitrag schrieb, viel mir ja ein, dass man nicht immer alle Spalten an das Modell übergeben möchte. Oder das es nur Readonly oder ähnliches ist.
Im Prinzip ist es auch einfach, wenn man weiß wie es geht. Der Designer in Visual Studio ist da meiner Meinung etwas umständlich in der Handhabung.
So möchte ich bei meinem letzten Modell die ID auf Readonly setzen, da dies in der Datenbank automatisch hochgezählt wird. Die ID daher manuell zu setzen würde keinen Sinn ergeben.
ADO.NET Modell

Dazu öffne ich das Modell im Visual Studio Designer und wähle oben die Tabelle aus. Unten wird mir nun das Fenster „Zuordnungsdetails“ angezeigt (alternativ über Ansicht » Weitere Fenster). Hier wähle ich die Spalte durch anklicken aus, die ich bearbeiten möchte. Wichtig ist jetzt dass ich hier nicht das vordere MSSQL-Feld sondern den hinteren Bereich, also den C# Typen auswähle (siehe Markierung).
ADO.NET Feld bearbeiten

Im Eigenschaftsfenster könnt ihr nun die entsprechenden Werte ändern. In dem Fall setzen wir den Setter auf Private.
Eigenschaften

Wenn wir nun versuchen eine Id zu setzen, hagelt es Fehlermeldungen:

TestTable test = new TestTable();
test.Id = 3;

Fehlermeldung lautet:

Die Eigenschaft oder der Indexer "MvcApplication1.Models.TestTable.Id" kann in diesem Kontext nicht verwendet werden, da der set-Accessor nicht verfügbar ist.

Auf diesen Weg können wir auch noch andere Sachen ändern, z.B. den Getter verändern oder den Namen des Attributs ändern.

Ach sollte man ein Feld gar nicht im Modell haben wollen, so wählt man bei den Zuordnungdetails einfach „Löschen“ aus.
ADO.NET Feld löschen

Auf den Weg könnt ihr das Feld später auch wieder ins Modell reinholen.

ADO.NET: Datenbankstruktur aktualisieren

Angenommen ihr habt eine Tabelle, auf die ihr mit dem ADO.NET Provider zugreift. Ihr habt ihn schön konfiguriert und nutzt ihn auch schon produktiv. Dieses Model könnte in etwa so aussehen:

ADO.NET Model

Auch wenn man sich vorher Gedanken gemacht hat, kann es sein, dass sich die Struktur der Datenbank ändert. Ein neues Feld muss hinzugefügt werden als Beispiel. Wie in meinem Beispiel.
Datenbankänderung

Nun möchte ich diese Änderungen natürlich auch möglichst einfach in mein Model bekommen, ohne dies neu anzulegen. Öffnet das Model in Visual Studio per Doppelklick, so dass ihr in den Designer kommt. Rechtsklickt dort irgendwo und wählt „Modell aus Datenbank aktualisieren“.
ADO.NET Modell aktualisieren

Wählt im folgenden Bildschirm den Reiter „Aktualisieren“. Hierbei sei erwähnt, dass nun alles aus der Datenbank aktualisiert wird! Also solltet ihr euch die Änderungen dann noch mal ansehen.
ADO.NET Aktualisieren

Zu guter letzt habt ihr nun das neue Feld in eurem Ado.Net Modell.
adonet5

C#: Hashes versalzen

Kleine Vorgeschichte
Heute habe ich mir die Möglichkeit angeschaut, eigene MembershipProvider für ein ASP.NET MVC Projekt zu schreiben. Selbstverständlich wollte ich die Passwörter in der Datenbank nur als Hash speichern. Gleich ist mir wieder ein altes Problem aufgefallen, welches mir auch damals bei PHP aufgefallen ist. Vorteil der Hashmethode ist die fehlende Möglichkeit, wieder in Klartext umgewandelt zu werden. Allerdings ist der Hash immer gleich.
So wird aus

md5(„test“) immer „098f6bcd4621d373cade4e832627b4f6“

Das Problem
Selbst wenn nun ein böser Hacker die Datenbank ausliest, kommt er so an das Passwort. Der einfachste Weg liegt dabei so nahe, dass man gar nicht drauf kommt. Gebt mal so einen Hash bei Google ein, man wird das Passwort herausfinden können. Und mittlerweile gibt es ganze Rainbow-Tabellen, so dass es immer einfacher wird, die Werte zu vergleichen.
Aufgrund des Einfallsreichtums mancher Menschen tippe ich mal darauf, dass man ca. 50% der Passwörter der Otto-Normal-Benutzer daher innerhalb weniger Minuten knacken könnte.
C#: Hashes versalzen weiterlesen

ASP.NET MVC: nl2br() Ersatz für HtmlHelper

Da ich ja ursprünglich von PHP herkomme, habe ich natürlich eine schöne Funktion wie nl2br() vermisst.
Da ich nichts gescheites gefunden habe, habe ich natürlich die Funktionen von C#3.0 ausgenutzt und einfach die HtmlHelper Class erweitert.
Vielleicht kann es ja wer gebrauchen.

using System.Web.Mvc;

namespace MyProject.CustomExtensions
{
    public static class MyHtmlHelperExtensions
    {
        public static string Encode(this HtmlHelper html, string text, bool convertNewLine)
        {
            if (convertNewLine)
            {
                return html.Encode(text).Replace("\n", "<br />");
            }
            return html.Encode(text);
        }

        public static string Encode(this HtmlHelper html, object text, bool convertNewLine)
        {
            if (convertNewLine)
            {
                return html.Encode(text).Replace("\n", "<br />");
            }
            return html.Encode(text);
        }
    }

}