2012-05-30 48 views
0

我有一個Sql工具類,其中包含許多有關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")); 
+0

您如何期望它將對象投射到Guid?它最初是Guid嗎?它是如何保存的? – SimpleVar

+0

如果它只是ID列中的一個Guid字符串,請嘗試'var guid = new Guid(SqlUtils.ExecuteScalar (...));' – SimpleVar

+0

也許我在這裏丟失了一些東西,但我認爲ExecuteScalar的要點是返回一個單一的價值。這意味着它從來不是一個複雜的類(假設你不把字符串和小數作爲類)。這意味着它總是返回一個int,guid,datetime等等。ExecuteScalar要求T成爲一個類的重點是什麼。它使ExecuteScalar方法變得毫無價值。唯一的情況是如果結果返回xml。 XML可以被串行化成一個類。 –

回答

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; 
0

由於這種方法的限制返回一個類類型,你可以返回匹配類類型(非原始),任何對象。鑑於你的方法的性質,但我不認爲有任何需要約束。您應該能夠移除此約束並返回可以生成的任何類型。

1

沒有辦法的辦法。如果轉換失敗,as運營商可能會返回null,因此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); 
}