DataSet table 可以填充来自两个来源的数据吗?
Can a DataSet table be filled with data from two sources?
我有一个 DataSet
并从其中的两个来源读取数据。一个 table 来自 XML 文件,另一个 table 来自 Firebird SQL 数据库。我试图得到的只是一个 table,它包含来自 XML 文件的所有列和来自 SQL 数据的几个字段,在一个 table 中。两个 table 都有相同的唯一键字段,因此可以轻松合并。我想将此 table 的所有字段绑定到表单上的字段。
是否可能像描述的那样,或者我没有看到有更简单的解决方案来解决我的问题?
编辑:
为了展示我尝试做的一些额外代码。
DataSet dataSet = new DataSet();
DataTable table1 = new DataTable("test1", "test1");
table1.Columns.Add("id");
table1.Columns.Add("name");
table1.Columns[0].Unique = true;
table1.Rows.Add(new object[2] { 1, "name1" });
table1.Rows.Add(new object[2] { 2, "name2" });
DataTable table2 = new DataTable("test2", "test2");
table2.Columns.Add("id");
table2.Columns.Add("thing");
table2.Columns[0].Unique = true;
table2.Rows.Add(new object[2] { 1, "thing1" });
table2.Rows.Add(new object[2] { 2, "thing2" });
dataSet.Tables.Add(table1);
dataSet.Tables[0].Merge(table2, false);
当我 运行 这段代码时,我得到 ConstraintException
。当我删除 id
字段上的唯一性时,它会用所有需要的列填充列表,但一行包含来自 table1
的数据,另一行包含 table2
数据。我怎样才能合并它们?
编辑 2:
我尝试在实时数据中使用 PrimaryKey 解决方案,如下所示。
xmlData.Tables[0].PrimaryKey = new[] { xmlData.Tables[0].Columns["usnr"] };
dbData.PrimaryKey = new[] { dbData.Columns["usid"] };
xmlData.Tables[0].Merge(dbData, true, MissingSchemaAction.Add);
xmlData 是来自 XML 文件的 DataSet
。它有 id、usnr 和其他一些字段。 dbData 是一个 DataTable
数据来自数据库,它有 id、usid、name 和其他一些字段。 id 字段与我的数据无关。正如我用 GetType()
.
测试的那样,usnr 和 usid 字段都是 table 中的字符串
当我现在添加 xmlData.Tables[0].Merge(dbData, true, MissingSchemaAction.Add);
时,它会抛出一个 DataException
<target>.ID and <source>.ID have conflicting properties: DataType property mismatch.
在写这篇文章时,我意识到两个 table 中的 id 字段不同,但我不需要它们,所以在更改 primaryKey 条目和合并之前删除了该列。现在我得到一个 NullReferenceException
,其中没有更多信息。 table都很好,里面有数据,现在异常从哪里来?
您可以为此目的使用 Linq,并像这样加入您的两个 DataTables
:
.........
.........
dataSet.Tables.Add(table1);
//dataSet.Tables[0].Merge(table2, false);
var collection = from t1 in dataSet.Tables[0].AsEnumerable()
join t2 in table2.AsEnumerable()
on t1["id"] equals t2["id"]
select new
{
ID = t1["id"],
Name = t1["name"],
Thing = t2["thing"]
};
DataTable result = new DataTable("Result");
result.Columns.Add("ID", typeof(string));
result.Columns.Add("Name", typeof(string));
result.Columns.Add("Thing", typeof(string));
foreach (var item in collection)
{
result.Rows.Add(item.ID, item.Name, item.Thing);
}
DataGridView
中的结果将是您想要的,如下所示:
dataGridView1.DataSource = result;
在这里您不能将这两个数据 table 合并在一起。您需要合并这两个 table 中的数据,每个迭代一次。
创建包含所有列(Id、名称、事物)的新数据 table。然后填充 table 读取其他两个。
而不是...
table1.Columns[0].Unique = true;
table2.Columns[0].Unique = true;
... 添加这些行:
table1.PrimaryKey = new[] { table1.Columns[0] };
table2.PrimaryKey = new[] { table2.Columns[0] };
因为合并命令需要知道数据表的主键。仅仅指出哪些列是唯一的是不够的。使用主键,输出将是:
id name thing
== ===== ======
1 name1 thing1
2 name2 thing2
请注意,要使其正常工作,主键字段必须具有匹配的数据类型和名称。如果数据类型不匹配,您会收到一条不错的错误消息。但是,如果名称不匹配,则会抛出一个无描述的空引用异常。微软本可以在这方面做得更好。
这意味着在您的情况下,我建议在合并数据表之前重命名 usnr
或 usid
。
我有一个 DataSet
并从其中的两个来源读取数据。一个 table 来自 XML 文件,另一个 table 来自 Firebird SQL 数据库。我试图得到的只是一个 table,它包含来自 XML 文件的所有列和来自 SQL 数据的几个字段,在一个 table 中。两个 table 都有相同的唯一键字段,因此可以轻松合并。我想将此 table 的所有字段绑定到表单上的字段。
是否可能像描述的那样,或者我没有看到有更简单的解决方案来解决我的问题?
编辑: 为了展示我尝试做的一些额外代码。
DataSet dataSet = new DataSet();
DataTable table1 = new DataTable("test1", "test1");
table1.Columns.Add("id");
table1.Columns.Add("name");
table1.Columns[0].Unique = true;
table1.Rows.Add(new object[2] { 1, "name1" });
table1.Rows.Add(new object[2] { 2, "name2" });
DataTable table2 = new DataTable("test2", "test2");
table2.Columns.Add("id");
table2.Columns.Add("thing");
table2.Columns[0].Unique = true;
table2.Rows.Add(new object[2] { 1, "thing1" });
table2.Rows.Add(new object[2] { 2, "thing2" });
dataSet.Tables.Add(table1);
dataSet.Tables[0].Merge(table2, false);
当我 运行 这段代码时,我得到 ConstraintException
。当我删除 id
字段上的唯一性时,它会用所有需要的列填充列表,但一行包含来自 table1
的数据,另一行包含 table2
数据。我怎样才能合并它们?
编辑 2: 我尝试在实时数据中使用 PrimaryKey 解决方案,如下所示。
xmlData.Tables[0].PrimaryKey = new[] { xmlData.Tables[0].Columns["usnr"] };
dbData.PrimaryKey = new[] { dbData.Columns["usid"] };
xmlData.Tables[0].Merge(dbData, true, MissingSchemaAction.Add);
xmlData 是来自 XML 文件的 DataSet
。它有 id、usnr 和其他一些字段。 dbData 是一个 DataTable
数据来自数据库,它有 id、usid、name 和其他一些字段。 id 字段与我的数据无关。正如我用 GetType()
.
当我现在添加 xmlData.Tables[0].Merge(dbData, true, MissingSchemaAction.Add);
时,它会抛出一个 DataException
<target>.ID and <source>.ID have conflicting properties: DataType property mismatch.
在写这篇文章时,我意识到两个 table 中的 id 字段不同,但我不需要它们,所以在更改 primaryKey 条目和合并之前删除了该列。现在我得到一个 NullReferenceException
,其中没有更多信息。 table都很好,里面有数据,现在异常从哪里来?
您可以为此目的使用 Linq,并像这样加入您的两个 DataTables
:
.........
.........
dataSet.Tables.Add(table1);
//dataSet.Tables[0].Merge(table2, false);
var collection = from t1 in dataSet.Tables[0].AsEnumerable()
join t2 in table2.AsEnumerable()
on t1["id"] equals t2["id"]
select new
{
ID = t1["id"],
Name = t1["name"],
Thing = t2["thing"]
};
DataTable result = new DataTable("Result");
result.Columns.Add("ID", typeof(string));
result.Columns.Add("Name", typeof(string));
result.Columns.Add("Thing", typeof(string));
foreach (var item in collection)
{
result.Rows.Add(item.ID, item.Name, item.Thing);
}
DataGridView
中的结果将是您想要的,如下所示:
dataGridView1.DataSource = result;
在这里您不能将这两个数据 table 合并在一起。您需要合并这两个 table 中的数据,每个迭代一次。
创建包含所有列(Id、名称、事物)的新数据 table。然后填充 table 读取其他两个。
而不是...
table1.Columns[0].Unique = true;
table2.Columns[0].Unique = true;
... 添加这些行:
table1.PrimaryKey = new[] { table1.Columns[0] };
table2.PrimaryKey = new[] { table2.Columns[0] };
因为合并命令需要知道数据表的主键。仅仅指出哪些列是唯一的是不够的。使用主键,输出将是:
id name thing
== ===== ======
1 name1 thing1
2 name2 thing2
请注意,要使其正常工作,主键字段必须具有匹配的数据类型和名称。如果数据类型不匹配,您会收到一条不错的错误消息。但是,如果名称不匹配,则会抛出一个无描述的空引用异常。微软本可以在这方面做得更好。
这意味着在您的情况下,我建议在合并数据表之前重命名 usnr
或 usid
。