我有下一个代码:
public static List<T> ExecuteQuery<T>(string qry, Dictionary<string, object> parameters = null)
{
using (var connection = new OdbcConnection(ConnectionString))
{
connection.Open();
var command = new OdbcCommand(qry, connection);
if (parameters != null)
{
foreach (var parameter in parameters)
{
command.Parameters.AddWithValue(parameter.Key, parameter.Value);
}
}
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
// ...
}
}
}
}
当我执行类似的事情时:
ExecuteQuery<MyClass>("SELECT * FROM MYTABLE WHERE ID = 1");
它返回所有正确的数据。但是当我寄这个时:
ExecuteQuery<MyClass>(
"SELECT * FROM MYTABLE WHERE ID = @Id",
new Dictionary<string, object> { { "@Id", 1 } });
不会返回任何内容。我尝试过使用command.Parameters.Add,但历史是一样的。
那么,我的错误在哪里?
感谢大家。
答案 0 :(得分:1)
尝试用?
代替命名参数,我相信这是OdbcCommand
使用的。
ExecuteQuery<MyClass>("SELECT * FROM MYTABLE WHERE ID = ?",
new Dictionary<string, object> { { "@Id", 1 } });
此外,由于Dictionary
不保证订单,因此如果您有多个参数,则可能需要将List<T>
替换为OdbcType
。列表保证订单。
我还建议指定Tuple<T,T,T>
,而不只是将所有参数值添加为对象。它必须推断出正确的数据类型,否则它可能会猜错。你可以创建一个更永久的类......在这里我决定只使用public static List<T> ExecuteQuery<T>(string qry, List<Tuple<string, OdbcType, object>> parameters = null)
...
...
foreach (var parameter in parameters)
{
command.Parameters.Add(parameter.Item1, parameter.Item2).Value = parameter.Item3;
}
。
source("http://silicovore.com/OOMPA/oompaLite.R")
oompaLite()