2012-09-04 61 views
1

我有以下功能:的DataTable轉換字段值到T

public T GetScalar<T>(string sql, T defaultValue, SQLParam[] sqlParams = null) 
{ 
    DataTable dt = GetDataTable(sql, sqlParams); 
    if (dt.Rows.Count == 0) return defaultValue; 
    else 
    { 
     try 
     { 
      object tmp = dt.Rows[0][0]; 
      return (T)tmp; 
     } 
     catch { return defaultValue; } 
    } 
} 

我得到了InvalidCastException

在調試過程中,我看到tmp的值是3,T的類型是int

這裏有什麼問題?

編輯

一點背景:這用於在MySQL工作。我現在已經轉移到SQLServer(謝天謝地),但現在這個代碼失敗了。

+4

什麼是'tmp.GetType()'? – Rawling

+0

爲什麼首先要聲明對象?爲什麼不只是'T tmp'? –

+0

如果你只需要一個標量,爲什麼你首先要加載一個'DataTable'? (這完全是出於好奇) –

回答

2

我懷疑值爲實際上一個long,或類似的東西 - 當你拆箱,你必須拆箱到確切型(大約有符號性和枚舉幾個古怪,但不long VS int)。

如果您將手錶放在tmp.GetType()上,或者只是從SQL中計算出它應該是什麼類型,那麼您應該可以看到這一點。

+0

@MarcGravell:在車輪上睡着了:( –

+0

手錶剛剛顯示它是類型'object {int}'。數據庫類型也是int。困惑爲什麼它不起作用,但是Michal的解決方案現在可以工作 – Simon

+0

@Simon:你真的調用了'GetType()'嗎?你真的有一個int,不能轉換爲它... –

3

試着改變你的線路:

return (T)tmp; 

return (T) Convert.ChangeType(tmp, typeof(T)); 
+0

+1此解決方案有效,謝謝。 – Simon

1

試着改變你的代碼在try塊這樣的:

 T tmp = dt.Rows[0].Field<T>(0); 
     return tmp; 

看看是否能工程 - 或在至少給你一個更好的錯誤。 :-)