Entity Framework에서 sql 명령을 직접 실행할 필요가 있다고 가정 해 봅시다. 내 SQL 문에서 매개 변수를 사용하는 방법을 알아내는 데 문제가 있습니다. 다음 예제 (실제 예제는 아님)가 작동하지 않습니다.
var firstName = "John";
var id = 12;
var sql = @"Update [User] SET FirstName = @FirstName WHERE Id = @Id";
ctx.Database.ExecuteSqlCommand(sql, firstName, id);
ExecuteSqlCommand 메서드를 사용하면 ADO.Net에서와 같이 명명 된 매개 변수를 전달할 수 없으며이 메서드에 대한 설명서 에는 매개 변수가있는 쿼리를 실행하는 방법에 대한 예가 없습니다.
매개 변수를 올바르게 지정하려면 어떻게합니까?
답변
이 시도:
var sql = @"Update [User] SET FirstName = @FirstName WHERE Id = @Id";
ctx.Database.ExecuteSqlCommand(
sql,
new SqlParameter("@FirstName", firstname),
new SqlParameter("@Id", id));
답변
이것이 작동한다는 것이 밝혀졌습니다.
var firstName = "John";
var id = 12;
var sql = "Update [User] SET FirstName = {0} WHERE Id = {1}";
ctx.Database.ExecuteSqlCommand(sql, firstName, id);
답변
다음 중 하나를 수행 할 수 있습니다.
1) 원시 인수를 전달하고 {0} 구문을 사용하십시오. 예 :
DbContext.Database.SqlQuery("StoredProcedureName {0}", paramName);
2) DbParameter 서브 클래스 인수를 전달하고 @ParamName 구문을 사용하십시오.
DbContext.Database.SqlQuery("StoredProcedureName @ParamName",
new SqlParameter("@ParamName", paramValue);
첫 번째 구문을 사용하는 경우 EF는 실제로 인수를 DbParamater 클래스로 랩핑하고 이름을 지정하고 {0}을 생성 된 매개 변수 이름으로 바꿉니다.
팩토리를 사용하거나 작성할 DbParamater 유형 (SqlParameter, OracleParamter 등)을 알 필요가 없기 때문에 선호하는 경우 첫 번째 구문입니다.
답변
Oracle을 사용할 때는 다른 답변이 작동하지 않습니다. :
대신 사용해야 합니다 @
.
var sql = "Update [User] SET FirstName = :FirstName WHERE Id = :Id";
context.Database.ExecuteSqlCommand(
sql,
new OracleParameter(":FirstName", firstName),
new OracleParameter(":Id", id));
답변
이것을 시도하십시오 (편집 됨).
ctx.Database.ExecuteSqlCommand(sql, new SqlParameter("FirstName", firstName),
new SqlParameter("Id", id));
이전 아이디어가 잘못되었습니다.
답변
entity Framework Core 2.0 이상에서이를 수행하는 올바른 방법은 다음과 같습니다.
var firstName = "John";
var id = 12;
ctx.Database.ExecuteSqlCommand($"Update [User] SET FirstName = {firstName} WHERE Id = {id}";
Entity Framework는 두 개의 매개 변수를 생성하므로 Sql Injection으로부터 보호됩니다.
또한 다음이 아닙니다.
var firstName = "John";
var id = 12;
var sql = $"Update [User] SET FirstName = {firstName} WHERE Id = {id}";
ctx.Database.ExecuteSqlCommand(sql);
Sql Injection으로부터 사용자를 보호하지 않으며 매개 변수가 생성되지 않기 때문입니다.
자세한 내용은 이것을 참조하십시오 .
답변
Oracle을위한 단순화 된 버전. OracleParameter를 생성하지 않으려는 경우
var sql = "Update [User] SET FirstName = :p0 WHERE Id = :p1";
context.Database.ExecuteSqlCommand(sql, firstName, id);