我想从数据集检索数据后,多选择和联合c#

本文关键字:选择 数据集 检索 数据 | 更新日期: 2023-09-27 18:12:28

我想从数据集检索数据(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})

如果我一次执行一条语句,没有union,它可以工作。

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)
{
}

我想从数据集检索数据后,多选择和联合c#

对于你想要达到的目标,你可以保存工会。将查询更改为

SELECT NO_IDENT_1, NO_IDENT_2
FROM P240538 
WHERE (P240538.DATE_dt > {2011/04/24}) 

你可以让你的循环保持原样。

如果您想使用联合解决方案,则上述语句的组合为真,并且您的查询应该像这样

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的工作方式是,结果集只有第一个SELECT的列名,但所有行(重复删除)…因此,您不能通过名称NO_IDENT_2访问列,只能访问值…即使数据来自UNION

中的第二个SELECT,列名仍然是NO_IDENT_1

你可以通过访问thisTable.Columns.Count来检查,SELECT的值为1。

将查询改为:

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";
    }

您只能联合具有相同列定义的数据集。列定义由查询中的第一组确定,在本例中,第一列命名为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})

这里,我们在结果中使用相同的列来表示相似的数据,并添加了一个新列来帮助我们区分数据的来源。如果你不介意,你可以删除Source列。