我在.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);
答案 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);
}