0

我有一个 Sql Utility 类,其中包含很多关于 Sql 查询的方便方法。该类包含以下方法:

public static T ExecuteScalar<T>(
    string query, 
    SqlConnection connection, 
    params SqlParameter[] parameters) 
    where T : class, new()
{
    SqlCommand command =
        CreateCommand(query, connection, parameters);

    return command.ExecuteScalar() as T;
}

是否可以返回例如Guid对象或其他不可为空的类。

像这样的东西:

Guid result = 
    SqlUtils.ExecuteScalar<Guid>(
        @"SELECT [Id] FROM [dbo].[MyTable]
            WHERE [Column1] = @Param1", 
        connection, 
        new SqlParameter("@Param1", "someValue"));
4

3 回答 3

4

您可以使用default(T)(并且您应该删除泛型类型约束):

SqlCommand command = 
    CreateCommand(query, connection, parameters);

object value = command.ExecuteScalar();

if (value == null || value is DbNull)
{
    return default(T)'
}

return (T)value;
于 2012-05-30T15:06:58.333 回答
1

不是你写的那样。如果转换失败,as运算符可能会返回,因此必须是引用类型。nullT

对于值类型,您需要使用传统的强制转换运算符(T)。您还需要删除T作为方法定义上的引用类型的约束。

public static T ExecuteScalar<T>(string query, 
                             SqlConnection connection, 
                             params SqlParameter[] parameters) 
{
    SqlCommand command = CreateCommand(query, connection, parameters);
    var result = command.ExecuteScalar();
    if (result is T) return (T)result;
    return default(T);
}
于 2012-05-30T15:07:09.487 回答
0

由于此方法的约束返回类类型,因此您可以返回任何与类类型(非原始)匹配的对象。不过,鉴于您的方法的性质,我认为不需要约束。您应该能够删除此约束并返回您可以生成的任何类型。

于 2012-05-30T15:06:18.537 回答