C# 如何将值转换为作为参数传递的类型
我有一个函数将执行聚合函数C# 如何将值转换为作为参数传递的类型,c#,database,C#,Database,我有一个函数将执行聚合函数(即COUNT()、MIN()、MAX()) 有时我想返回int、double、date、datetime…. 我在转换返回值时遇到问题 下面这行给了我一个错误value=Convert.ChangeType(vv,typeof(T)) 这里是错误 无法将类型“object”隐式转换为“T”。存在显式转换(是否缺少强制转换?) 这是我的方法 public T getValue<T>(string query, List<MySqlParameter&g
(即COUNT()、MIN()、MAX())
有时我想返回int、double、date、datetime….
我在转换返回值时遇到问题
下面这行给了我一个错误value=Convert.ChangeType(vv,typeof(T))代码>
这里是错误
无法将类型“object”隐式转换为“T”。存在显式转换(是否缺少强制转换?)
这是我的方法
public T getValue<T>(string query, List<MySqlParameter> pars)
{
T 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
{
object vv = (T)cmd.ExecuteScalar();
if (vv != null)
{
value = Convert.ChangeType(vv, typeof(T) );
}
} catch(Exception ex){
Common.Alert(ex.ToString(), "SQL Error");
value = default(T);
} finally {
conn.Close();
}
}
return value;
}
public T getValue(字符串查询、列表部分)
{
T值;
使用(var conn=new MySqlConnection(conn_string))
使用(var cmd=newmysqlcommand(query,conn))
{
如果(PAR!=null)
{
foreach(PAR中的mysqlp参数)
{
cmd.Parameters.Add(p);
}
}
conn.Open();
尝试
{
对象vv=(T)cmd.ExecuteScalar();
如果(vv!=null)
{
值=Convert.ChangeType(vv,typeof(T));
}
}捕获(例外情况除外){
Common.Alert(例如ToString(),“SQL错误”);
值=默认值(T);
}最后{
康涅狄格州关闭();
}
}
返回值;
}
当我使用这个方法时,我使用这个
int cnt = db.getValue<int>(query, params);
int cnt=db.getValue(查询,参数);
您的代码没有多大意义。首先将其强制转换为T
,然后如果它不为null,则将其转换为T
?转换是无用的。我认为值得指出的是,您得到的特定错误(“无法隐式地将类型“object”转换为“T”。”)是因为返回一个对象,因此它通常在调用后立即强制转换:
value = (T)Convert.ChangeType(v, typeof(T));
在您的情况下,您可能需要执行以下操作:
object rawValue = cmd.ExecuteScalar();
value = (T)Convert.ChangeType(rawValue, typeof(T));
请注意,如果rawValue
为null
且T
为值类型(struct
,例如int
),则此(部分)代码将引发异常。这可能比静默地将值设置为默认值(T)
要好,因为您的代码没有太多意义。首先将其强制转换为T
,然后如果它不为null,则将其转换为T
?转换是无用的。我认为值得指出的是,您得到的特定错误(“无法隐式地将类型“object”转换为“T”。”)是因为返回一个对象,因此它通常在调用后立即强制转换:
value = (T)Convert.ChangeType(v, typeof(T));
在您的情况下,您可能需要执行以下操作:
object rawValue = cmd.ExecuteScalar();
value = (T)Convert.ChangeType(rawValue, typeof(T));
请注意,如果rawValue
为null
且T
为值类型(struct
,例如int
),则此(部分)代码将引发异常。这可能比静默地将值设置为默认值(T)
要好,因为您的代码没有太多意义。首先将其强制转换为T
,然后如果它不为null,则将其转换为T
?转换是无用的。我认为值得指出的是,您得到的特定错误(“无法隐式地将类型“object”转换为“T”。”)是因为返回一个对象,因此它通常在调用后立即强制转换:
value = (T)Convert.ChangeType(v, typeof(T));
在您的情况下,您可能需要执行以下操作:
object rawValue = cmd.ExecuteScalar();
value = (T)Convert.ChangeType(rawValue, typeof(T));
请注意,如果rawValue
为null
且T
为值类型(struct
,例如int
),则此(部分)代码将引发异常。这可能比静默地将值设置为默认值(T)
要好,因为您的代码没有太多意义。首先将其强制转换为T
,然后如果它不为null,则将其转换为T
?转换是无用的。我认为值得指出的是,您得到的特定错误(“无法隐式地将类型“object”转换为“T”。”)是因为返回一个对象,因此它通常在调用后立即强制转换:
value = (T)Convert.ChangeType(v, typeof(T));
在您的情况下,您可能需要执行以下操作:
object rawValue = cmd.ExecuteScalar();
value = (T)Convert.ChangeType(rawValue, typeof(T));
请注意,如果rawValue
为null
且T
为值类型(struct
,例如int
),则此(部分)代码将引发异常。这可能比默默地让值为default(T)
要好。总体而言,这似乎有点危险。。。例如,您可以请求int,但数据库将其存储为long。您应该让方法调用方自己转换/强制转换值,并让方法返回表中支持的相同类型。但是count将始终返回int,具体取决于COLLMN的类型,我将传递正确的类型。因此,如果我要检查一个双列的最大值,那么我可以这样做double cnt=db.getValue(query,params)代码>等。但是,我愿意采用更好的方法。请在回答中给我一个正确的方法。您看到的错误消息是有意义的。检查ChangeType
的返回类型。阅读错误消息。您正在将一个对象存储在类型为T的变量中。总的来说,这似乎有点危险。。。例如,您可以请求int,但数据库将其存储为long。您应该让方法调用方自己转换/强制转换值,并让方法返回表中支持的相同类型。但是count将始终返回int,具体取决于COLLMN的类型,我将传递正确的类型。因此,如果我要检查一个双列的最大值,那么我可以这样做double cnt=db.getValue(query,params)代码>等。但是,我愿意采用更好的方法。请在回答中给我一个正确的方法。您看到的错误消息是有意义的。检查ChangeType
的返回类型。阅读错误消息。您正在将一个对象存储在类型为T的变量中。总的来说,这似乎有点危险。。。例如,您可以请求int,但数据库将其存储为long。您应该让方法调用方自己转换/强制转换值,并让方法返回表中支持的相同类型。但是count将始终返回int,具体取决于