0

Sqlクエリに関する多くの便利なメソッドを含むSql Utilityクラスがあります。このクラスには、次のメソッドが含まれています。

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オブジェクトやその他の null 非許容クラスを返すことは可能ですか。

このようなもの:

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 に答える