【问题标题】:.net dynamic set value for data column in a dataset.net 数据集中数据列的动态设置值
【发布时间】:2014-04-04 14:39:40
【问题描述】:

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

【问题讨论】:

  • 你能发布你的代码吗?
  • 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);
  • @Lourens:我想要动态属性设置值之类的东西
  • @Blam:你能描述更多细节吗?我上面代码的问题是 dr.GetType().GetProperty("COLUMN1") 返回 null。
  • 没关系。我误解了这个问题。

标签: .net reflection dataset typeconverter changetype


【解决方案1】:

.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;
}

【讨论】:

  • 我的数据集不是全新的,它是由数据库中的适配器返回的。所以现在我想使用反射或其他方法来获取数据集的底层 DataColumn.DataType,我将从该 DataType 中转换一些值,例如 Int32 值到 DataColumn.DataType 的正确类型。
  • 我添加了一种使用反射来设置类型的方法。但是,您首先必须检查从数据库中获得的数据类型。
  • 抱歉我的描述不好,我已经在上面重新发布了我的代码。这里的场景是我从数据库获取数据到我的数据集 - 我不确切知道 db 服务器上的列类型与 .NET 数据集数据列中的类型之间的类型映射,但我知道该列的确切名称为“第 1 列”。所以现在,我想要一些机制来获取该列的确切 .NET 数据类型来转换一些输入值(例如这里的整数)以创建新行并将该行插入数据库。
【解决方案2】:

参考: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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2013-02-04
    相关资源
    最近更新 更多