當通過DataRow的循環和遇到的類型,如開始使用C#中返回的DataRow類型的建議方法是什麼?
DataRow dr;
dr["someString"]
dr["someInteger"]
dr["somedata"]
什麼讓他們到他們相應的數據類型的最佳方式? dr [「foo」]只是一個通用對象。
此外,這些能夠很容易地轉換爲可空類型? dr [「someInteger」]可能爲空。
當通過DataRow的循環和遇到的類型,如開始使用C#中返回的DataRow類型的建議方法是什麼?
DataRow dr;
dr["someString"]
dr["someInteger"]
dr["somedata"]
什麼讓他們到他們相應的數據類型的最佳方式? dr [「foo」]只是一個通用對象。
此外,這些能夠很容易地轉換爲可空類型? dr [「someInteger」]可能爲空。
從DataRow中讀取時,最大的敵人是空值。在DataRow
中,當值爲空時,它不等於空值:它等於DBNull.Value
。
if(DBNull.Value == null)
{
// Will never happen
}
除非您知道您的字段不能爲空,否則投射並不安全。例如,如果數據的DBNull下面的例子將失敗:
string name = (string)dr["Name"];
如果你可以使用LINQ的擴展,可以包括參考System.Data.DataSetExtensions
和命名空間System.Data
並調用
string name = dr.Field<string>("Name");
如果您不能使用LINQ,那麼你必須退回到檢查空值與
string name = null;
if(!dr.IsNull("Name"))
name = (string)dr["Name"];
或者你可以像THI編寫自己的場函數S:
public static T GetValue<T>(object value)
{
if (value == null || value == DBNull.Value)
return default(T);
else
return (T)value;
}
,並得到你的價值是這樣的:
string name = GetValue<string>(dr["Name"]);
簡單鑄造的值,以正確的類型應該工作:
(string) dr["someString"];
(int?) dr["someInteger"];
(byte[]) dr["somedata"];
警告,'(INT?)博士[ 「someInteger」];如果值是DBNull的'會失敗。 – 2009-09-04 20:29:48
舉例說,調用int.Parse()有什麼好處嗎? – Gratzy 2009-09-04 20:36:09
是否有獲取(int?)工作的捷徑。我在想像int?.TryParse(dr [「some」])? (int?)dr [「some」]:null – 2009-09-04 20:46:11
如果你可以使用.NET 3.5,那麼你可以使用Field extension method更容易地訪問數據,如果你知道的類型。一個例子是:
string somestring= row.Field<string>("SomeString");
否則你堅持鑄造領域的類型對象的老式方法。
我卡住了。謝謝:) – 2009-09-04 20:42:44
string GetString(DataRow dr, string ColumnName)
{
if (dr.IsNull(ColumnName))
{
return null;
}
return (string)dr[ColumnName];
}
在這裏返回一個空字符串而不是空值是否更有意義? – Mike 2009-09-04 21:43:43
也許,但列值也可以有「」,所以你必須以某種方式區分。這取決於你喜歡/需要它。 – 2009-09-05 01:50:40
另一種選擇是使用 「爲」
string str = dr["someString"] as string;
如果是DBNull.Value(或任何其他對象不是字符串類型),那麼str會得到一個真正的「null」。否則,它會得到正確的字符串值。
對於值類型,你可以使用可空,即
int? i = dr["someint"] as int?;
再次,它會得到的,而不是DBNull.Value一個真正的「零」。然而,可空類型,你必須記得用.value的,即
int x = i.Value + 5;
int?我= 3; int x = i + 5;將無法工作?奇怪的!從來不知道。 – 2009-09-30 21:55:47
甚至不會編譯 – JoelFan 2009-10-01 21:22:11
如果你調用int i = dr.Field(「someintcolumn」);該行是空的? –
2009-09-04 20:56:37
字段()足夠明亮以返回默認值(T),因此如果數據爲空,則您的i變量將等於0。 –
2009-09-04 20:58:54
+1爲徹底,並花時間來覆蓋空值。 – womp 2009-09-04 21:20:43