.net动态设置数据集中数据列的值

时间:2014-03-03 13:55:53

标签: .net reflection dataset typeconverter changetype

我在.NET数据集中有这种数据转换的情况:我有一个新的数据库,我在我的数据集中查询了一个表但是我不确切知道数据集中DataTable的DataColumn的数据类型,我想插入一些新的数据在设计时不完全知道DataColumn.DataType。所以,我的想法是我可以使用反射来获取DataColumn的类型以精确地插入新数据。 有人请告诉我,我是否可以这样做以及如何?

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

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

2 个答案:

答案 0 :(得分: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";

修改

对于具有parse方法的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;
}

答案 1 :(得分:0)

参考:https://stackoverflow.com/a/9028087/2919255

DataSet dsCloned = ds.Clone();
dsCloned.Tables[0].Columns[4].DataType = typeof(string);
foreach (DataRow row in ds.Tables[0].Rows) 
{
    dsCloned.Tables[0].ImportRow(row);
}