代码之家  ›  专栏  ›  技术社区  ›  rudolfdobias

ef 2.1+npgsql+executesqlcommand=在“$1”处或附近出现语法错误

  •  1
  • rudolfdobias  · 技术社区  · 8 年前

    由于EF CORE 2.1,检查了SQLS的注入情况。没关系。

    但是正确的方法是什么 ExecuteSqlCommand ?

    var content = "whatever";
    

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

    执行“通知测试,@p0”。那是错误的。

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

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

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

    有效,但“warning 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核心2.1.301
    • EF核心2.1.1
    • NPGSQL 2.1.1标准
    2 回复  |  直到 8 年前
        1
  •  1
  •   Shay Rojansky    8 年前

    PostgreSQL不支持 NOTIFY 声明。。。如果您尝试使用常规DML,例如 SELECT INSERT 一切正常。

    如果您真的想参数化通知,您仍然可以执行客户端字符串插值,但一定要清理用户输入,否则您将打开SQL注入。

        2
  •  0
  •   cpoDesign    8 年前

    我想我错过了一些东西:

    在查看文档时( 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.
    

    基于“通知测试”,我不知道你想做什么

    推荐文章