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