2015-05-06 26 views
0

我有下面的代码:的OdbcCommand与参数不返回任何

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

尝试用?代替指定的参数,我相信它是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; 
} 
+0

谢谢!!有用!!! – DannSaHa

+1

我喜欢你关于OdbcType的建议,但是我的数据库提供者可能会在任何时候改变,所以这意味着我需要使用最独立的方式 – DannSaHa