PostgresException:42601:“00”或附近的语法错误

Posted

技术标签:

【中文标题】PostgresException:42601:“00”或附近的语法错误【英文标题】:PostgresException: 42601: syntax error at or near "00" 【发布时间】:2021-12-20 16:04:16 【问题描述】:

我正在开发 ASP.NET CORE MVC 项目

我需要从前端传递两个日期,如图所示:HERE

我的看法:

    <form method="post" asp-controller="HOME" asp-action="AllTransactionsList">
    <label> Start Date</label>
    <input type="date"  name="startDate"></br>
    <label> End Date</label>
    <input type="date"  name="endDate"></br>
    <button type="submit">ADD</button>
</form>

我的控制器方法:

        public IActionResult AllTransactionsList(DateTime startDate, DateTime endDate)
    
        var dataset = new DataSet();
        using var connection = new NpgsqlConnection(connString);
        connection.Open();
        Console.WriteLine(startDate);
        var query = String.Format(@"SELECT accounts.account,accounts.type,DATE(transactions.date),transactions.amount,transactions.note FROM transactions FULL JOIN accounts ON transactions.accountid=accounts.accountid WHERE transactions.date BETWEEN 0 AND 1;", startDate, endDate);

        using (var command = new NpgsqlCommand(query, connection))
        

            var adapter = new NpgsqlDataAdapter(command);
            adapter.Fill(dataset);
        

        return View(dataset);

    

但是在执行 webapp 时,我收到“PostgresException: 42601: syntax error at or near "00"”错误。

我知道将两个日期作为参数传递有问题。谁能帮帮我?

【问题讨论】:

你一定忘记了日期文字周围的单引号。 @LaurenzAlbe 来自网络表单,即使使用单引号,也会导致潜在的 SQL 注入 @Bruno 对,这就是你必须正确转义这些值的原因。 @LaurenzAlbe 转义值的问题在于,作为这些工具的用户,通常很难正确处理 (here is a similar example with php/mysql):当客户端库支持时,通常最好使用参数化查询传递参数它。 @Bruno 再次,非常正确。我只是想指出错误的原因。 【参考方案1】:

你不应该像这样直接在查询字符串中传递参数:

var query = String.Format(@"SELECT ... BETWEEN 0 AND 1;", startDate, endDate);

首先,像这样在查询字符串中包含参数可能会产生语法错误(正如您所注意到的),除非它本身是有效的 SQL。

其次,更重要的是,这将导致 SQL 注入漏洞(即使您要在 '0' 周围加上引号)

相反,您应该pass parameters with placeholders。这是文档中的示例:

using (var cmd = new NpgsqlCommand("INSERT INTO table (col1) VALUES (@p)", conn)) 
    cmd.Parameters.AddWithValue("p", "some_value");
    cmd.ExecuteNonQuery();

【讨论】:

以上是关于PostgresException:42601:“00”或附近的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PostgresException 中获取错误 sql

连接到 Redshift 集群时出错 - Npgsql.PostgresException: 28000: no pg_hba.conf entry for host

PostgresException: 42883: function ifnull(integer, integer) does not exist

DB2 SQL error: SQLCODE: -104, SQLSTATE: 42601, SQLERRMC

PostgreSQL:错误:42601:返回“记录”的函数需要列定义列表

Amazon Redshift CREATE FUNCTION ERROR: 42601: 在“默认”或接近“默认”时出现语法错误