带参数的OdbcCommand不返回任何内容

时间:2015-05-06 16:19:50

标签: c# mysql .net odbc

我有下一个代码:

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,但历史是一样的。

那么,我的错误在哪里?

感谢大家。

1 个答案:

答案 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()