Załóżmy, że mam uzasadnioną potrzebę bezpośredniego wykonania komendy sql w Entity Framework. Mam problem z ustaleniem, jak używać parametrów w mojej instrukcji SQL. Poniższy przykład (nie mój prawdziwy przykład) nie działa.
var firstName = "John";
var id = 12;
var sql = @"Update [User] SET FirstName = @FirstName WHERE Id = @Id";
ctx.Database.ExecuteSqlCommand(sql, firstName, id);
Metoda ExecuteSqlCommand nie pozwala na przekazanie nazwanych parametrów, jak w ADO.Net, a dokumentacja tej metody nie zawiera żadnych przykładów wykonywania sparametryzowanego zapytania.
Jak poprawnie określić parametry?
entity-framework
entity-framework-4.1
jessegavin
źródło
źródło
Okazuje się, że to działa.
źródło
SqlParameter("@paramName", value)
zamiast tego.Możesz albo:
1) Przekaż nieprzetworzone argumenty i użyj składni {0}. Na przykład:
2) Przekaż argumenty podklasy DbParameter i użyj składni @ParamName.
Jeśli użyjesz pierwszej składni, EF faktycznie otoczy twoje argumenty klasami DbParamater, przypisze im nazwy i zastąpi {0} wygenerowaną nazwą parametru.
Pierwsza składnia, jeśli preferowana, ponieważ nie trzeba używać fabryki ani wiedzieć, jaki typ DbParamaters należy utworzyć (SqlParameter, OracleParamter itp.).
źródło
Inne odpowiedzi nie działają podczas korzystania z Oracle. Musisz użyć
:
zamiast@
.źródło
Spróbuj tego (edytowane):
Poprzedni pomysł był zły.
źródło
W przypadku jednostki Framework Core 2.0 lub nowszej poprawny sposób to:
Zauważ, że Entity Framework wygeneruje dla ciebie dwa parametry, więc jesteś chroniony przed wstrzykiwaniem SQL.
Pamiętaj również, że NIE:
ponieważ to NIE chroni cię przed wstrzykiwaniem SQL i nie są generowane żadne parametry.
Zobacz to po więcej.
źródło
ctx.Database.ExecuteSqlCommand("Update [User] SET FirstName = {firstName} WHERE Id = {id}", firstName, id);
FormattableString
. Masz rację i to całkiem fajne!Uproszczona wersja dla Oracle. Jeśli nie chcesz tworzyć OracleParameter
źródło
To takie proste !!!
Obraz do poznania odniesienia do parametru
źródło
W przypadku metody asynchronicznej („ExecuteSqlCommandAsync”) możesz użyć jej w następujący sposób:
źródło
Jeśli bazowymi typami danych są varchar, powinieneś trzymać się poniższego podejścia. W przeciwnym razie zapytanie miałoby ogromny wpływ na wydajność.
Możesz sprawdzić profil Sql, aby zobaczyć różnicę.
źródło
Stosowanie:
źródło
ExecuteSqlCommand()
Powinieneś być pewien, że odpowiesz na konkretne pytanie zadawane podczas publikowania odpowiedzi.Wiele parametrów w procedurze przechowywanej, która ma wiele parametrów w vb:
źródło
Procedury przechowywane można wykonać jak poniżej
źródło
W przypadku .NET Core 2.2 można używać
FormattableString
do dynamicznego SQL.źródło