DbContext.Database.ExecuteSqlCommand 메서드에 매개 변수를 전달하는 방법은 무엇입니까? id = 12; var sql = @”Update

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);