Der ExecuteSqlCommand oder auch FromSql Methode können Parameter einer SQL-Abfrage auf 3 verschiedene Arten übergeben werden. Folgende Beispiele zeigen immer das Einfügen in eine Tabelle mit Identity-Spalte und das anschliessense Auslesen des Identity-Werts.
Variante 1: Benannte SqlParameter
var nameSqlParam = new SqlParameter("@UserName", SqlDbType.NVarChar, 64);
nameSqlParam.Value = "TestUser 1";
var idSqlParam = new SqlParameter("@Id", SqlDbType.Int)
idSqlParam.Direction = ParameterDirection.Output;
ctx.Database.ExecuteSqlCommand(
"INSERT INTO [User] (Name) VALUES (@UserName); SET @Id = SCOPE_IDENTITY();",
nameSqlParam, idSqlParam);
Die SqlParameter müssen hier genau gleich heissen wie in der SQL-Abfrage. Die Reihenfolge wie die Parameter in der ExecuteSqlCommand Methode übergeben werden spielt hier keine Rolle.
Variante 2: Platzhalter für SqlParameter
ctx.Database.ExecuteSqlCommand(
"INSERT INTO [User] (Name) VALUES ({0}); SET {1} = SCOPE_IDENTITY();",
nameSqlParam, idSqlParam);
Die Platzhalter in der SQL-Abfrage müssen mit {0} beginnen und lückenlos aufsteigend nummeriert sein. Die Reihenfolge wie die SqlParameter in der ExecuteSqlCommand Methode übergeben werden spielt keine Rolle.
Variante 3: FormattableString
string nameString = "TestUser 2";
ctx.Database.ExecuteSqlCommand(
$@"INSERT INTO [User] (Name) VALUES ({nameString});
SET {idSqlParam} = SCOPE_IDENTITY();");
Die Parameter werden hier mittels String-Interpolation direkt in den FormattableString eingefügt (man beachte das $ am Anfang). Es können primitive Datentypen oder SqlParameter angegeben werden. Wichtig: SqlParameter müssen zwingend einen Namen haben der mit @ beginnt!