2010-11-28 26 views
0

因此,众所周知,.NET的SqlClient类提供了一种从数据库获取数据的方法,该方法返回object。虽然适当转换并不是一件大事,但我想写一个强类型的版本来返回一个正确类型的对象。所以,我写了下面的C#:如何将一个类型参数添加到我的DAL的ExecuteScalar实现?

public T ExecuteScalar<T>(IDbCommand cmd) where T : struct 
{ 
    cmd.Connection = this.conn; 
    object o = cmd.ExecuteScalar(); 
    return (T)o; 
} 

这非常适用于布尔和DateTime秒。但是,对于整数,它会抛出一个InvalidCastException。所以,我做了任何带有Reflector副本的人都会做的事,并且插入Field<T>(this DataRow, string columnName)扩展方法。我剔除了用来将值转换为请求的类型并进行测试的内部类。但是,对于值类型,代码只是return (T)value; - 这当然没有帮助。

所以,我的问题:任何人有任何想法如何让我的方法正确地返回所有值类型和字符串的值?即使只是字符串,布尔值,DateTime和int会很好。

在此先感谢!

+0

仅供参考:`string`是一个引用类型。 – 2010-11-28 17:02:38

+0

另外,如果查询未返回结果,则可能导致铸件错误。 – 2010-11-28 17:03:36

回答

0

在你的代码看演员应该是OK,如果返回值实际上是一个整数。

也许你的数据库返回NULL?在这种情况下,o将是DBNull.Value,在投射前你必须考虑到这一点。一个简单的方法是使用int?,或者你可以决定在这种情况下抛出异常。

如果null不是问题,那么请在ExceuteScalar调用后尝试发布o的具体类型。

0

如果返回的对象不是一个整数(如果它是一个float,double,byte等),它被装箱到一个对象,并且只能被转换回它的原始类型。检查o的类型。

相关问题