2014-03-03 44 views
1

我在.NET數據集中有這種數據轉換的情況:我有一個新的數據庫,我向我的數據集查詢了一張表,但我不知道DataColumn的數據類型數據集中的數據表,我想插入一些新的數據,而不知道設計時的DataColumn.DataType。所以,我的想法是我可以使用反射來獲取DataColumn的類型以精確插入新數據。 有人請告訴我我是否可以這樣做?.net數據集中數據列的動態設置值

SomeDbDataAdapter da = new SomeDbDataAdapter("select * from table1", conn); 
       DataSet ds = new DataSet(); 
       da.Fill(ds); 

       Int32 i = 1; 

       DataRow dr = ds.Tables[0].NewRow(); 
       PropertyInfo colInfo = dr.GetType().GetProperty("COLUMN1"); 
       Type t = ds.Tables[0].Columns["COLUMN1"].DataType; 
       colInfo.SetValue(dr, Convert.ChangeType(i, t), null); 

       ds.Tables[0].Rows.Add(dr); 

       SomeDbCommandBuilder builder = new SomeDbCommandBuilder(da); 
       builder.GetInsertCommand(); 

       DataRow[] rows = ds.Tables[0].Select("", "", DataViewRowState.Added); 
       da.Update(rows); 

+0

您可以發佈您的代碼? – Lourens

+0

Int32 i = 1; DataRow dr = ds.Tables [0] .NewRow(); PropertyInfo colInfo = dr.GetType()。GetProperty(「COLUMN1」); 類型t = ds.Tables [0] .Columns [「COLUMN1」] .DataType; colInfo.SetValue(dr,Convert.ChangeType(i,t),null); colInfo.SetValue – anhdung88

+0

@Lourens:我想要動態屬性設置值 – anhdung88

回答

0

的.NET的DataRow會自動嘗試將值轉換成目標類型。 下面的代碼運行正常,即使列類型是int

DataSet ds = new DataSet(); 
ds.Tables.Add(); 
ds.Tables[0].Columns.Add("COLUMN1", typeof(int)); 

DataRow dr = ds.Tables[0].NewRow(); 

Type t = ds.Tables[0].Columns["COLUMN1"].DataType; 

dr["COLUMN1"] = "4"; 

但是增加一個不正確的值將產生一個異常

dr["COLUMN1"] = "four"; 

編輯:

對於SQL類型的具有一個解析方法,你可以使用反射。某些類型的像的SqlString,不要需要人工分析,並且可以通過DataRow的

DataSet ds = new DataSet(); 
ds.Tables.Add(); 
ds.Tables[0].Columns.Add("COLUMN1", typeof(SqlInt32)); 

DataRow dr = ds.Tables[0].NewRow(); 

string value = "4"; 

Type t = ds.Tables[0].Columns["COLUMN1"].DataType; 

MethodInfo methodInfo = t.GetMethod("Parse"); 

if (methodInfo != null) 
{ 
    dr["COLUMN1"] = methodInfo.Invoke(null, new object[] { value }); 
} 
else 
{ 
    dr["COLUMN1"] = value; 
} 
+0

我的數據集不是全新的,它是由數據庫中的適配器返回的。所以現在我想使用反射或其他方式來獲取數據集的底層DataColumn.DataType,從該數據類型中,我會將一些值(例如Int32值)轉換爲DataColumn.DataType的正確類型。 – anhdung88

+0

我已經添加了一種使用反射來設置類型的方法。然而,您首先必須檢查從數據庫中獲取哪些數據類型。 – Lourens

+0

對不起,我的錯誤描述,我已經重新發布我的代碼上面。這裏的場景是我從數據庫中獲取數據到我的數據集 - 我不知道數據庫服務器上的列的類型與.NET數據集datacolumn中的類型之間的類型映射,但我知道該列的確切名稱爲「COLUMN1」。所以現在,我想要一些機制來獲取該列的確切.NET數據類型,以便投射某些輸入值(如此處的整數)以創建新行並將該行插入到數據庫中。 – anhdung88