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

时间:2016-08-26 20:59:48

标签: c# sql odbc intersystems-cache

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

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(),但实际上我并不理解其中的差异。

导致空结果的原因是什么?

2 个答案:

答案 0 :(得分:2)

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

通过参数,框架为您提供了所有这些内容。它还检查sql注入并删除不相关的字符。特别是对于字符串和日期时间值,这非常有用。

答案 1 :(得分:-1)

继续使用:

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

但试试这个:

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