使用Dapper进行查询筛选

6

我在使用Dapper进行查询时遇到了问题,希望有人能帮我解决并告诉我我的错误在哪里。当我设置断点时,它显示了一个日期错误,请问如何正确地进行修正?非常感谢您的帮助。

以下是我的当前代码:

public string GetBezeichnung(int LP, DateTime date)
{
    using (IDbConnection connection = new System.Data.SqlClient.SqlConnection())
    {
        connection.ConnectionString = _ConnectionString;
        var output = connection.Query<string>("SELECT ZER_Bezeichnung FROM Z_ERFASSUNG WHERE ZER_LPE = " + LP + " AND ZER_Datum = " + date).FirstOrDefault();
        return output;
    }
}

这是我得到错误的结果:

image description here


完全参数化查询。如果您使用@Shaun提供的解决方案作为一般模式运行,当处理用户输入时,您将面临SQL注入攻击的风险。使用参数化参数可以完全避免Sql注入问题。 - Quibblesome
3个回答

6
尝试对查询进行参数化处理。
public string GetBezeichnung(int LP, DateTime date)
{
    using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(_ConnectionString))
    {
        connection.Open();
        string sql = @"
SELECT ZER_Bezeichnung 
FROM Z_ERFASSUNG 
WHERE ZER_LPE = @LP
  AND ZER_Datum = @date"
        var output = connection.Query<string>(sql, new { LP = LP, date = date }).FirstOrDefault();
        return output;
    }
}

2

我同意@Parrish Husband的观点,但第二个参数必须是"Date = date"。

在您的示例中,日期周围没有',因此AQL认为它是一堆东西。

将其更改为

var output = connection.Query<string>("SELECT ZER_Bezeichnung FROM Z_ERFASSUNG WHERE ZER_LPE = " + LP + " AND ZER_Datum = '" + date + "'").FirstOrDefault();

会让它工作。


4
请注意,这仍然容易受到 SQL 注入攻击。 - Parrish Husband
1
@ParrishHusband 我更喜欢你的回答,但我不认为你在Sql注入方面是正确的。这段代码位于一个以int和DateTime作为参数的方法中。据我所知,你不能使用它们来进行Sql注入。如果我错了,请纠正我。 - Reinstate Monica Cellio
2
@Archer 有趣的观点,我认为在这种情况下你是正确的。虽然养成安全习惯从来不是坏主意,而且新漏洞何时出现也无法预测。 - Parrish Husband
@ParrishHusband,我完全同意您关于养成良好习惯的观点。这也是我喜欢您的答案的原因,因为我会将查询参数化(如果不是在存储过程中——这取决于我所在的工作环境)。 - Reinstate Monica Cellio
@Archer,这是关于模式的建立。如果它适用于日期,那么很有可能会被复制到字符串中,并且随着时间的推移,用户输入也将通过这条最小阻力路径流动。 - Quibblesome
@Quibblesome 我同意这个观点,正如你可以从我的先前评论中看出来的那样。我只是指出这个例子不容易受到SQL注入攻击。 - Reinstate Monica Cellio

0
使用以下代码行,以便匹配确切的日期。如果日期的时间不同,则不会获取那些记录。
var output = connection.Query<string>("SELECT ZER_Bezeichnung FROM Z_ERFASSUNG WHERE ZER_LPE = " + LP + " AND Cast( ZER_Datum as DATE) = Cast('" + date + "' as DATE)").FirstOrDefault();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接