C# 我想在multi-select和union C之后从dataset检索数据

C# 我想在multi-select和union C之后从dataset检索数据,c#,sql,select,dataset,union,C#,Sql,Select,Dataset,Union,我想从数据集visual studio 2010检索数据 下面是sql语句: SELECT NO_IDENT_1 FROM P240538 WHERE (P240538.DATE_dt > {2011/04/24}) Union SELECT NO_IDENT_2 FROM P240538 WHERE (P240538.DATE_dt > {2011/04/24}) 如果我在没有工会的情况下一次做一个陈述,它就会起作用 string sqltring ="SELECT

我想从数据集visual studio 2010检索数据 下面是sql语句:

SELECT NO_IDENT_1 
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24}) 
Union 
SELECT NO_IDENT_2 
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24})
如果我在没有工会的情况下一次做一个陈述,它就会起作用

string sqltring ="SELECT NO_IDENT_1 FROM P240538 WHERE (P240538.DATE_dt > {2011/04/24}) Union SELECT NO_IDENT_2 FROM P240538 WHERE (P240538.DATE_dt > {2011/04/24})"

OleDbConnection ConnFoxPro = new OleDbConnection(Properties.Settings.Default.S_ConnFoxPro26);
try
{
    ConnFoxPro.Open();
   // MessageBox.Show("  Connection State = " + ConnFoxPro.State);
}
catch (OleDbException ex)
{
    string errorMessages = "";
    for (int i = 0; i < ex.Errors.Count; i++)
    {
        errorMessages += "Index #" + i + "\n" +
                "Message: " + ex.Errors[i].Message + "\n" +
                "NativeError: " + ex.Errors[i].NativeError + "\n" +
                "Source: " + ex.Errors[i].Source + "\n" +
                "SQLState: " + ex.Errors[i].SQLState + "\n";
    }
    System.Diagnostics.EventLog log = new System.Diagnostics.EventLog();
    log.Source = "Mon application";
    log.WriteEntry(errorMessages);
    Console.WriteLine("Vous avez un exeption. Svp Contacter votre administrateur de system cdd ");
}
{

    try
{
    //MessageBox.Show(RqCompte);
    OleDbDataAdapter DA_ID = new OleDbDataAdapter(sqltring, ConnFoxPro);
    DataSet Ds_ID = new DataSet();
    DA_ID.Fill(Ds_ID, "P240538");

    foreach (DataTable thisTable in Ds_ID.Tables)
    {
        // For each row, print the values of each column.

        foreach (DataRow row in thisTable.Rows)
        {
           // string rowdata = row.ItemArray[0].ToString().Replace(" ", "");
            string rowdata1 = row["NO_IDENT_1"].ToString().Replace(" ", "");
            if (rowdata1 != "")
                liste_No_Ident += rowdata1 + " ";// +"NOMBRE = " + row["nbr_doublon"] + "\n\n";
            string rowdata2 = row["NO_IDENT_2"].ToString().Replace(" ", "");
            if (rowdata2 != "")
                liste_No_Ident += rowdata2 + " ";// +"NOMBRE = " + row["nbr_doublon"] + "\n\n";


        }
    }
}
catch (Exception e)
{
}
UNION的工作方式是,结果集只有第一个SELECT的列名,但删除了所有重复的行。。。因此,您不能通过名称NO_IDENT_2访问列,只有值。。。即使数据来自UNION的第二个SELECT,列名仍将为NO_IDENT_1


通过访问thisTable.Columns.Count,您可以检查它是否具有所使用的SELECT的值1。

您只能合并具有相同列定义的数据集。列定义由查询中的第一个集合确定,在这种情况下,第一个列命名为NO_IDENT_1。如果这些列是不同的类型,那么联合就完全失败了。如果希望代码按编写的方式工作,可以将查询更改为:

SELECT NO_IDENT_1, NULL AS NO_IDENT_2
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24}) 
Union 
SELECT NULL AS NO_IDENT_1, NO_IDENT_2 
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24})
在这里,我们在每个查询中创建一个伪列,作为另一个数据集中不存在的列的占位符

或者,您可以更改代码以使用类似于以下内容的内容:

SELECT NO_IDENT_1 AS NO_IDENT, 1 AS SOURCE
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24}) 
Union 
SELECT NO_IDENT_2 AS NO_IDENT, 2 AS SOURCE
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24})

在这里,我们对相似的数据使用结果中的同一列,并添加了一个新列来帮助我们区分数据来自何处。如果您不介意,可以随时删除源列。

将查询更改为:

SELECT NO_IDENT_1 AS IDENT
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24}) 
Union 
SELECT NO_IDENT_2 AS IDENT
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24})
并将循环更改为:

    foreach (DataRow row in thisTable.Rows)
    {
       // string rowdata = row.ItemArray[0].ToString().Replace(" ", "");
        string rowdata1 = row["IDENT"].ToString().Replace(" ", "");
        if (rowdata1 != "")
            liste_No_Ident += rowdata1 + " ";// +"NOMBRE = " + row["nbr_doublon"] + "\n\n";
    }

为了你想要实现的目标,你可以拯救联邦。将您的查询更改为

SELECT NO_IDENT_1, NO_IDENT_2
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24}) 
你可以让你的循环保持原样

如果您想使用union解决方案,则上述语句的组合是正确的,您的查询应该如下所示

SELECT NO_IDENT_1 AS NO_IDENT 
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24}) 
Union All
SELECT NO_IDENT_2 AS NO_IDENT 
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24})

请记住,应该避免联合查询,因为它们会对性能产生负面影响。

有什么问题?你有错误吗?看起来不应该的数据?发生了什么事?记住,联合不会返回重复的数据。如果要查看重复数据,请使用UNION ALL。请提供您正在获得的输出以及所需输出的详细信息。建议:您可能希望将数据库对象命名为比P240538更具描述性的名称。。。另外:尝试对数据库手动运行sql,我想您会对得到的结果感到惊讶。