2014-12-31 94 views
0

我想写一个genertic方法,让我回到一个聚合函数(ie. COUNT(), MAX(), MIN())如何使用c#返回MySQL的聚合函数的结果?

问题是MIN()/MAX()可以返回datetime, date, decimal, int.所以我希望能够处理所有的值的值。我需要这个数字只返回一个值而不是多个列。

如何让此方法返回任何值?

// query the data base 
    public IEnumerable<T> getValue<T>(string query, List<MySqlParameter> pars) 
    { 
     double value; 
     using (var conn = new MySqlConnection(conn_string)) 
     using (var cmd = new MySqlCommand(query, conn)) 
     { 

      if (pars != null) 
      { 
       foreach (MySqlParameter p in pars) 
       { 
        cmd.Parameters.Add(p); 
       } 
      } 

      conn.Open(); 
      try 
      { 
       value = Convert.ToDouble(cmd.ExecuteScalar()); 

      } catch(Exception ex){ 

       MessageBox.Show(ex.ToString(), "SQL Error", MessageBoxButtons.OK); 
       value = -1; 

      } finally { 
       conn.Close(); 
      } 

     } 

     return value; 
    } 

回答

1

声明value作为TExecuteScalar结果转换为T

T value; 
// ... 
try 
{ 
    value = (T)cmd.ExecuteScalar(); 
} 
catch(Exception ex) 
{ 
    MessageBox.Show(ex.ToString(), "SQL Error", MessageBoxButtons.OK); 
    value = default(T); 

} 
finally 
{ 
    conn.Close(); 
} 
+0

我正在逐渐'返回值的误差;''无法隐式转换类型 'T' 到 'System.Collections.Generic.IEnumerable '。存在明确的转换(你是否缺少一个转换?)'另外,'default(T)'做了什么? – Jaylen

+0

@Mike您需要将返回类型更改为T. default(T)会根据类型给出默认值。如果它是一个引用类型,则返回null,如果值类型将所有成员设置为其默认值。 –

+0

尝试使用它时出现错误。这里是我如何使用它'int cnt =(int)(db.getValue(sSQL,parms1));'我正在传递一个COUNT(*)函数'错误方法'POS.dbConnetion .getValue (字符串,System.Collections.Generic.List )'不能从用法推断。尝试明确指定类型参数' – Jaylen

1
public T getValue<T>(string query, List<SqlParameter> param) { 

    // your existing code 

    object value = cmd.ExecuteScalar(); 

    // This line will change the to the right type. You still need to handle null 
    // and various Nullable type if you use these 
    return Convert.ChangeType(value, typeof(T)); 
} 

// to use 
int cnt = getValue<int>(query, params); 
+0

谢谢。尝试使用该方法时出现错误。这里是我如何使用它int cnt =(int)db.getValue(sSQL,parms1);并且我正在传递COUNT(*)函数错误1方法'POS.dbConnetion.getValue (字符串,System.Collections.Generic.List )'的类型参数不能从用法。尝试明确指定类型参数 – Jaylen

+0

请参阅更新后的代码。请注意,返回现在是T,而不是IEmunerable

+0

纠正了错误,但没有得到SQL错误System.InvalidCastException:指定的转换不是值.... getValue [T](String query,List 1 pars)... 。 – Jaylen