C# 将2个复杂数据表合并到DataGridView C时出现的问题#
我有两个由两个复杂查询组成的数据表,我想用C#代码将其结果合并并绑定到datagridview。我不想再对这两个sql进行任何连接,因为它已经很复杂了,我在C#代码中使用了动态sql。(sql server compact-无法使用SPs) 我使用的代码是:C# 将2个复杂数据表合并到DataGridView C时出现的问题#,c#,datagridview,merge,sql-server-ce,C#,Datagridview,Merge,Sql Server Ce,我有两个由两个复杂查询组成的数据表,我想用C#代码将其结果合并并绑定到datagridview。我不想再对这两个sql进行任何连接,因为它已经很复杂了,我在C#代码中使用了动态sql。(sql server compact-无法使用SPs) 我使用的代码是: dataT = FkDataAccess.GetDataPostsCars(selTmpMPs,fromDateTime, toDateTime); dataTLocationsTransposed = FkDataAccess.GetLo
dataT = FkDataAccess.GetDataPostsCars(selTmpMPs,fromDateTime, toDateTime);
dataTLocationsTransposed = FkDataAccess.GetLocationDetailsTransposed();
dataTMerged = dataTLocationsTransposed.Copy();
dataTMerged.Merge(dataT);
this.dataGridView1.DataSource = dataTMerged;
dataT result具有包含某些数据的列:
T.MonitorDateTime似乎是一个日期时间值 “”作为MonitorDateTime是一个VARCHAR
我的猜测是,除非数据类型匹配,否则它不会合并这些。将所有日期强制转换为VARCHAR或使用NULL而不是“” 证明使用LINQ Union有效。创建了2个列表对象,并将每个datatable 1和2的datarows添加到这些对象中。然后执行了列表和coptoDataTable()的并集,结果成功了
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;
dataTLocationsTransposed=FkDataAccess.GetLocationDetailsTransposed(selectedPostCombined);
List list1=新列表();
foreach(dataT.Rows中的DataRow dr)
{
列表1.添加(dr);
}
List list2=新列表();
foreach(dataTLocationsTransposed.Rows中的DataRow dr)
{
列表2.添加(dr);
}
dataTMerged=list2.Union(list1.CopyToDataTable();
this.dataGridView1.DataSource=dataTMerged;
您能发布合并的两个查询吗?即使列名不匹配,数据类型也可能不匹配吗?例如,在Q2示例中,MonitorDateTime是一个VARCHAR。是另一个表中的DATETIME吗?您好,我编辑了“查询其他合并数据表dataT”下的注释。其他数据表dataT中的MonitorDateType为DATETIME类型。如何在Q2中指定这一点。在第二季度没有那个的日期时间。在原始表中,datetime字段上允许null。为什么在没有GROUP BY子句的第一个查询中有MAX函数?噢!因为它在没有团队的情况下工作。为什么我们需要一个呢?请参阅“否”中的相关问题。您不需要分组依据,但也不需要MAX函数。在本例中,它在不影响值的情况下消耗cpu周期。由于没有GROUP BY,查询正在对单个值运行MAX函数。5的最大值始终为5。。。。等等,我使用了NULL,例如:选择NULL作为MonitorDateTime。。然后是其他的。。还是不行。。我还可以试试别的吗。做一个实验。。。而不是合并两个不同的查询。。。将每一个合并到它自己,看看它是否有效。如果没有,我们知道问题与列名或数据类型无关。。。如果是这样的话……2。在该MonitorDateTime列中返回显式日期,而不是NULL或“”。例如,返回1/1/1900,看看这是否修复了合并。将所有其他日期数据强制转换为varchar将影响我的动态图表,依此类推。。因为它使用数据表作为日期时间类型。我不想把它搞得一团糟。实验1将每个数据合并到它自己(工作),然后尝试2。与原始合并。(未返回任何内容):-(
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
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')
SELECT T.MonitorDateTime,T.MainGate,T.SouthAdminBuilding,T.WestGate
FROM GdRateTempPosts T WHERE T.MonitorDateTime BETWEEN @fromDateTime
AND @toDateTime ORDER BY T.MonitorDateTime
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;