2015-05-06 62 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