带参数的 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;
}
我有下一个代码:
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;
}