C# 删除重复的列名,然后再将其添加到DataTable

C# 删除重复的列名,然后再将其添加到DataTable,c#,sql,wpf,C#,Sql,Wpf,这是我的密码: private void executerRequete(string requete, string description, string niveauAlerte) { RequetesSQLResult res = new RequetesSQLResult(); res.Description = description; string StSQL = requete; res.Results = new DataTable();

这是我的密码:

private void executerRequete(string requete, string description, string niveauAlerte)
{
    RequetesSQLResult res = new RequetesSQLResult();
    res.Description = description;

    string StSQL = requete;
    res.Results = new DataTable();
    try
    {
        using (SqlConnection _oConnection = new SqlConnection(_dataService.ParamGlobaux.ConnectionString))
        {
            SqlCommand command = new SqlCommand(StSQL, _oConnection);
            command.Parameters.AddWithValue("@mat", _dataService.ParamGlobaux.StMatricule);
            command.Parameters.AddWithValue("@dd", dateDebut);
            command.Parameters.AddWithValue("@df", datefin);


            _oConnection.Open();
            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    var row = res.Results.NewRow();
                    object[] values = new object[reader.FieldCount];
                    int fieldCount = reader.GetValues(values);

                    if (res.Results.Columns.Count == 0)
                    {
                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            res.Results.Columns.Add(new DataColumn(reader.GetName(i)));
                        }
                    }

                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        row[i] = values[i];
                    }

                    res.Results.Rows.Add(row);
                }
            }
        }
    }
    catch (Exception x)
    {
        Debug.WriteLine(x.Message + ":" + x.StackTrace);
    }

    if (res.Results.Rows.Count > 0)
    {
        Results.Add(res);
    }
}
我的问题是当循环到达这里时:

res.Results.Columns.Addnew DataColumnreader.GetNamei

只要我只用一张桌子,一切都很好。当我使用两个或多个表时,我得到一条错误消息列[I]已经存在

例如:

SELECT * FROM Contrats X, Contrats Y
WHERE x.Avenant = 'CONTRAT' AND y.Avenant = 'CONTRAT' AND X.Matricule = Y.Matricule AND x.[Num Contrat] != y.[Num Contrat] AND
((x.[Date début] < y.[Date Fin] AND x.[Date Fin] > Y.[Date début]) OR
(x.[Date début] > y.[Date début] AND y.[Date Fin] IS NULL) OR
(x.[Date début] < y.[Date début] AND y.[Date Fin] IS NULL))
AND x.Matricule = @mat
=>错误是:列“Name”已经存在,因为每个表读取两次


如果它们具有相同的名称,如何仅保留一列?

在添加之前,您可以检查是否已经存在具有相同名称的列:

string name = reader.GetName(i);
if (!res.Results.Columns.Contains(name))
    res.Results.Columns.Add(new DataColumn(name));

在添加列之前,可以检查是否已经存在同名列:

string name = reader.GetName(i);
if (!res.Results.Columns.Contains(name))
    res.Results.Columns.Add(new DataColumn(name));

在这种情况下,您不应该使用SELECT*,而是必须使用SELECT Column1、Column2、,。。第n列

使用JOIN链接两个表而不是逗号也是一种很好的做法


在这种情况下,您不应该使用SELECT*,而是必须使用SELECT Column1、Column2、,。。第n列

使用JOIN链接两个表而不是逗号也是一种很好的做法


两个表都需要数据吗

如果不是-仅返回第一个表数据

select X.* from ...
如果是-在select中列出所有必填字段,并为其指定唯一名称:

select X.Name as X_Name, Y.Name as Y_Name from ...

两个表都需要数据吗

如果不是-仅返回第一个表数据

select X.* from ...
如果是-在select中列出所有必填字段,并为其指定唯一名称:

select X.Name as X_Name, Y.Name as Y_Name from ...