无法获取参数以在 C# 中使用 OdbcConnection

Can't get parameters to work with OdbcConnection in C#

我是 运行 具有几个日期限制的查询。如果我在硬编码日期且没有参数的情况下执行下面的代码,我会得到我期望的结果(一个简单的整数)。但是,当我尝试使用参数时,我得到一个空的结果集。没有错误,只是没有结果。

log("Connecting to SQL Server...");
string connectionString = "DSN=HSBUSTEST32;";

string queryString = "SELECT COUNT(*) FROM Table WHERE myDateTime >= '?' AND myDateTime < '?'";
//string queryString = "SELECT COUNT(*) FROM Table WHERE myDateTime >= '@startDate' AND myDateTime < '@endDate'";

string startDate = "2016-08-23";
string endDate = "2016-08-24";

using (OdbcConnection connection = new OdbcConnection(connectionString))
{
    OdbcCommand command = new OdbcCommand(queryString, connection);
    command.Parameters.AddWithValue("startDate",startDate);
    command.Parameters.AddWithValue("endDate", endDate);
    //command.Parameters.Add("startDate", OdbcType.VarChar).Value = "2016-08-23";
    //command.Parameters.Add("endDate", OdbcType.VarChar).Value = "2016-08-24";

    try
    {
        connection.Open();
        OdbcDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            log(reader[0].ToString());
        }
        reader.Close();
    }
    catch (Exception ex)
    {
        log(ex.Message);
    }
}

如您所见,我已经尝试了命名参数以及使用 ? 占位符。我还尝试了几种不同的添加参数的方法,Add()AddWithValue(),但说实话我不明白其中的区别。

什么导致结果为空?

我之前说过,您的查询的问题是单引号。如果您在没有参数的情况下传递值,则需要使用这些单引号,因为这在语句中定义了一个字符串。

使用参数,框架会为您处理所有这些东西。它还检查 sql 注入并删除不允许的字符。特别是对于字符串和日期时间值,这真的很有帮助。

继续使用这个:

string queryString = "SELECT COUNT(*) FROM Table WHERE myDateTime >= @startDate AND myDateTime < @endDate";

但试试这个:

command.Parameters.AddWithValue("@startDate",startDate);
command.Parameters.AddWithValue("@endDate", endDate);