带有插入字符串的ExecuteSqlCommand导致“无效的输入语法”错误

时间:2018-07-31 17:50:52

标签: c# entity-framework-core ef-core-2.1

根据此docsthis,我应该能够像这样将内插的字符串传递给ExecuteSqlCommandAsync

public async Task DeleteEntries(DateTimeOffset loggedOn) {
    await myContext.Database.ExecuteSqlCommandAsync(
        $"DELETE from log_entry WHERE logged_on < '{loggedOn}';"
    );
}

但是,它给了我以下错误:Npgsql.PostgresException: '22007: invalid input syntax for type timestamp with time zone: "@p0"'

  1. loggedOn是有效日期。
  2. 将插值的字符串提取为临时变量可以解决该问题,但是我丢失了SQL注入攻击的输入验证。

我是在做错什么还是这是EFCore中的错误?使用最新的EFCore 2.1

2 个答案:

答案 0 :(得分:1)

@IvanStoev提供的答案是删除插值参数周围的单引号。

答案 1 :(得分:0)

您所引用的网页警告您不要在SQL中插入直接值,即使用如下参数:

FromSql("EXECUTE dbo.GetMostPopularBlogsForUser @user", user)

因此,请根据您的需要进行调整,并添加以下内容:

FromSql("DELETE from log_entry WHERE logged_on < @logged_on", loggedOn.ToString("0"))

P.S。请勿在表名上使用双引号"-不使用引号或将[]换成[log_entry]