将 2 个复杂的 DataTables 合并到 DataGridView C# 的问题
Issues Merging 2 complex DataTables to a DataGridView C#
我有 2 个由 2 个复杂查询组成的数据表,我想在 C# 代码中合并并绑定到 datagridview 的结果。我不想再次对 2 sql 进行任何连接,因为它已经很复杂了,我在 C# 代码中为此使用了动态 sql。 (sql 服务器紧凑型 - SP 不可能)。
我使用的代码:
dataT = FkDataAccess.GetDataPostsCars(selTmpMPs,fromDateTime, toDateTime);
dataTLocationsTransposed = FkDataAccess.GetLocationDetailsTransposed();
dataTMerged = dataTLocationsTransposed.Copy();
dataTMerged.Merge(dataT);
this.dataGridView1.DataSource = dataTMerged;
dataT 结果包含包含一些数据的列:
<<== 标记的是 dataTLocationsTransposed 中要合并到 dataT 的预期行
MonitorDateTime MainGate SouthAdminBuilding WestGate
Main-Date det.. South side of admin…west-gate det…<<==
01.02.2014 13:00 6 5 3 <-dataT
21.02.2014 14:00 45 6 8 <-dataT
dataTLocationsTransposed 获取上述列的详细信息,我使用 2 个查询 Q1 和 Q2 进行了测试。 Q1 有效,作为新行添加到 dataT 列结构中,但它创建了 4 个其他列名称 Column1 等。除了上面显示的列之外。我需要 dataT 列结构正下方的结果。
Q1:
SELECT '',
MAX(CASE WHEN LocColumn = 'MainGate' THEN LocDescription ELSE '' END),
MAX(CASE WHEN LocColumn = 'SouthAdminBuilding' THEN LocDescription ELSE '' END),
MAX(CASE WHEN LocColumn = 'WestGate' THEN LocDescription ELSE '' END)
FROM MonitorLocationDetails
WHERE LocColumn IN ('MainGate','SouthAdminBuilding','WestGate')
这会产生如下结果:
col1 col2 col3 col4 MonitorDateTime MainGate SouthAdminBuilding WestGate
预计我想要的是没有 col1、col2..... 但就在指定的列名称下方。
因此,当我将 Q1 修改为 Q2 时,它也会产生结果,但它在来自 C# 的 Merge 调用中失败。
Q2:
SELECT '' AS MonitorDateTime,
MAX(CASE WHEN LocColumn = 'MainGate' THEN LocDescription ELSE '' END)
AS MainGate,
MAX(CASE WHEN LocColumn = 'SouthAdminBuilding' THEN LocDescription
ELSE '' END) AS SouthAdminBuilding,
MAX(CASE WHEN LocColumn = 'WestGate' THEN LocDescription ELSE '' END)
AS WestGate
FROM MonitorLocationDetails
WHERE LocColumn IN ('MainGate','SouthAdminBuilding','WestGate')
查询其他合并数据表 dataT 是:
SELECT T.MonitorDateTime,T.MainGate,T.SouthAdminBuilding,T.WestGate
FROM GdRateTempPosts T WHERE T.MonitorDateTime BETWEEN @fromDateTime
AND @toDateTime ORDER BY T.MonitorDateTime
非常感谢任何帮助。谢谢。
T.MonitorDateTime 似乎是 DATETIME 值
'' AS MonitorDateTime 是 VARCHAR
我猜它不会合并这些,除非数据类型匹配。将所有日期转换为 VARCHAR 或使用 NULL 而不是 ''。
原来使用 LINQ Union 可以工作。创建了 2 个 List 对象并将每个数据表 1 和 2 的数据行添加到这些对象中。然后执行列表联合和 CopToDataDataTable() 并且它起作用了。
dataTLocationsTransposed = FkDataAccess.GetLocationDetailsTransposed(selectedPostCombined);
List<DataRow> list1 = new List<DataRow>();
foreach (DataRow dr in dataT.Rows)
{
list1.Add(dr);
}
List<DataRow> list2 = new List<DataRow>();
foreach (DataRow dr in dataTLocationsTransposed.Rows)
{
list2.Add(dr);
}
dataTMerged = list2.Union(list1).CopyToDataTable();
this.dataGridView1.DataSource = dataTMerged;
我有 2 个由 2 个复杂查询组成的数据表,我想在 C# 代码中合并并绑定到 datagridview 的结果。我不想再次对 2 sql 进行任何连接,因为它已经很复杂了,我在 C# 代码中为此使用了动态 sql。 (sql 服务器紧凑型 - SP 不可能)。
我使用的代码:
dataT = FkDataAccess.GetDataPostsCars(selTmpMPs,fromDateTime, toDateTime);
dataTLocationsTransposed = FkDataAccess.GetLocationDetailsTransposed();
dataTMerged = dataTLocationsTransposed.Copy();
dataTMerged.Merge(dataT);
this.dataGridView1.DataSource = dataTMerged;
dataT 结果包含包含一些数据的列:
<<== 标记的是 dataTLocationsTransposed 中要合并到 dataT 的预期行
MonitorDateTime MainGate SouthAdminBuilding WestGate
Main-Date det.. South side of admin…west-gate det…<<==
01.02.2014 13:00 6 5 3 <-dataT
21.02.2014 14:00 45 6 8 <-dataT
dataTLocationsTransposed 获取上述列的详细信息,我使用 2 个查询 Q1 和 Q2 进行了测试。 Q1 有效,作为新行添加到 dataT 列结构中,但它创建了 4 个其他列名称 Column1 等。除了上面显示的列之外。我需要 dataT 列结构正下方的结果。
Q1:
SELECT '',
MAX(CASE WHEN LocColumn = 'MainGate' THEN LocDescription ELSE '' END),
MAX(CASE WHEN LocColumn = 'SouthAdminBuilding' THEN LocDescription ELSE '' END),
MAX(CASE WHEN LocColumn = 'WestGate' THEN LocDescription ELSE '' END)
FROM MonitorLocationDetails
WHERE LocColumn IN ('MainGate','SouthAdminBuilding','WestGate')
这会产生如下结果:
col1 col2 col3 col4 MonitorDateTime MainGate SouthAdminBuilding WestGate
预计我想要的是没有 col1、col2..... 但就在指定的列名称下方。
因此,当我将 Q1 修改为 Q2 时,它也会产生结果,但它在来自 C# 的 Merge 调用中失败。
Q2:
SELECT '' AS MonitorDateTime,
MAX(CASE WHEN LocColumn = 'MainGate' THEN LocDescription ELSE '' END)
AS MainGate,
MAX(CASE WHEN LocColumn = 'SouthAdminBuilding' THEN LocDescription
ELSE '' END) AS SouthAdminBuilding,
MAX(CASE WHEN LocColumn = 'WestGate' THEN LocDescription ELSE '' END)
AS WestGate
FROM MonitorLocationDetails
WHERE LocColumn IN ('MainGate','SouthAdminBuilding','WestGate')
查询其他合并数据表 dataT 是:
SELECT T.MonitorDateTime,T.MainGate,T.SouthAdminBuilding,T.WestGate
FROM GdRateTempPosts T WHERE T.MonitorDateTime BETWEEN @fromDateTime
AND @toDateTime ORDER BY T.MonitorDateTime
非常感谢任何帮助。谢谢。
T.MonitorDateTime 似乎是 DATETIME 值
'' AS MonitorDateTime 是 VARCHAR
我猜它不会合并这些,除非数据类型匹配。将所有日期转换为 VARCHAR 或使用 NULL 而不是 ''。
原来使用 LINQ Union 可以工作。创建了 2 个 List 对象并将每个数据表 1 和 2 的数据行添加到这些对象中。然后执行列表联合和 CopToDataDataTable() 并且它起作用了。
dataTLocationsTransposed = FkDataAccess.GetLocationDetailsTransposed(selectedPostCombined);
List<DataRow> list1 = new List<DataRow>();
foreach (DataRow dr in dataT.Rows)
{
list1.Add(dr);
}
List<DataRow> list2 = new List<DataRow>();
foreach (DataRow dr in dataTLocationsTransposed.Rows)
{
list2.Add(dr);
}
dataTMerged = list2.Union(list1).CopyToDataTable();
this.dataGridView1.DataSource = dataTMerged;