我正在运行一个带有几个日期约束的查询。如果我执行下面的代码,日期是硬编码的,没有参数,我得到一个我期望的结果(一个简单的整数)。但是,当我尝试使用参数时,我得到一个空的结果集。没有错误,只是没有结果。
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()
,但实际上我并不理解其中的差异。
导致空结果的原因是什么?
答案 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);