EF 2.1 + Npgsql + ExecuteSqlCommand =“ $ 1”或附近的语法错误

时间:2018-07-10 13:22:41

标签: c# asp.net-core npgsql ef-core-2.1 .net-core-2.1

从EF Core 2.1开始,将检查SQL是否进行注入。很好。

但是将参数传递到ExecuteSqlCommand的正确方法是什么?

var content = "whatever";

...

var command = @"NOTIFY test, '{0}'";
ctx.Database.ExecuteSqlCommand(command, content);
  

执行“ NOTIFY测试,'@ p0'”。错了

ctx.Database.ExecuteSqlCommand($"NOTIFY test, {content}");
  

消息:42601:“ $ 1”或附近的语法错误。

var command = $"NOTIFY test, {content}";
ctx.Database.ExecuteSqlCommand(command);
  

有效,但是“警告EF1000:传递给'FromSql'的SQL表达式嵌入了不会被参数化的数据。(...)“。   错误。这正是我要解决的问题。

var command = @"NOTIFY test, @Content";
ctx.Database.ExecuteSqlCommand(command, new SqlParameter("@Content", content));
  

InvalidCastException:“值必须是NpgsqlParameter。”哦,很好。

var command = @"NOTIFY test, @Content";
ctx.Database.ExecuteSqlCommand(command, new NpgsqlParameter("@Content", content));
(or)
ctx.Database.ExecuteSqlCommand(command, new NpgsqlParameter("Content", content));
  

消息:42601:“ $ 1”或附近的语法错误。认真吗?

var command = @"NOTIFY test, {0}";
(or)
var command = @"NOTIFY test, $1";
(or)
var command = @"NOTIFY test, @Content";
ctx.Database.ExecuteSqlCommand(command, new NpgsqlParameter{Value = content});
  

消息:42601:“ $ 1”或附近的语法错误。   我退出了。

我想念什么吗?

  • .NET Core 2.1.301
  • EF Core 2.1.1
  • Npgsql 2.1.1

2 个答案:

答案 0 :(得分:1)

PostgreSQL根本不支持SELECT语句中的参数...如果尝试使用常规的DML,例如INSERT$whereData = [ ['status', 'P'], ['end_date', '<', now()] ]; $publishedConferences = $user->conferences()-> where($whereData)-> paginate($pageLimit); ,则一切正常。

如果您确实想对通知进行参数化,则仍然可以进行客户端字符串内插,但请确保清理用户输入,否则您将接受SQL注入。

答案 1 :(得分:0)

我想念一些东西

在查看文档时(http://www.npgsql.org/doc/index.html) 有这样的样品

还可以显示示例表结构吗?

var connString = "Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase";

using (var conn = new NpgsqlConnection(connString))
{
    conn.Open();

    // Insert some data
    using (var cmd = new NpgsqlCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText = "INSERT INTO data (some_field) VALUES (@p)";
        cmd.Parameters.AddWithValue("p", "Hello world");
        cmd.ExecuteNonQuery();
    }

    // Retrieve all rows
    using (var cmd = new NpgsqlCommand("SELECT some_field FROM data", conn))
    using (var reader = cmd.ExecuteReader())
        while (reader.Read())
            Console.WriteLine(reader.GetString(0));
}
You can find more info about the ADO.NET API in the MSDN docs or in many tutorials on the Internet.

基于“ NOTIFY测试”,我不知道您要做什么