C# 将2个复杂数据表合并到DataGridView C时出现的问题#

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

我有两个由两个复杂查询组成的数据表,我想用C#代码将其结果合并并绑定到datagridview。我不想再对这两个sql进行任何连接,因为它已经很复杂了,我在C#代码中使用了动态sql。(sql server compact-无法使用SPs)

我使用的代码是:

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;