Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将值转换为作为参数传递的类型_C#_Database - Fatal编程技术网

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,具体取决于