带参数的 OdbcCommand 没有 return 任何东西

OdbcCommand with parameters doesn't return anything

我有下一个代码:

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");

它return所有正确的数据。但是当我发送这个时:

ExecuteQuery<MyClass>(
    "SELECT * FROM MYTABLE WHERE ID = @Id", 
    new Dictionary<string, object> { { "@Id", 1 } });

没有 return 任何东西。我试过 command.Parameters.Add 但历史是一样的。

所以,我的错误在哪里?

感谢大家。

尝试用 ? 替换命名参数,我相信这是 OdbcCommand 使用的。

ExecuteQuery<MyClass>("SELECT * FROM MYTABLE WHERE ID = ?",
                      new Dictionary<string, object> { { "@Id", 1 } });

此外,由于 Dictionary 不能保证顺序,如果您有多个参数,您可能希望将其替换为 List<T>。列表保证顺序。

我还建议指定 OdbcType 而不仅仅是将所有参数值添加为对象。否则它必须推断出正确的数据类型,而且它可能会猜错。你可以创建一个更永久的 class...在这里我决定只使用 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;
}