关于sql:我想在进行多次选择和联合C#之后从数据集中检索数据

I would like to retrieve data from dataset after multi select and union C#

我想从数据集中检索数据(Visual Studio 2010)
这是sql语句:

1
2
3
4
5
6
7
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一次执行一条语句,它将起作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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 +"\
"
+
               "Message:" + ex.Errors[i].Message +"\
"
+
               "NativeError:" + ex.Errors[i].NativeError +"\
"
+
               "Source:" + ex.Errors[i].Source +"\
"
+
               "SQLState:" + ex.Errors[i].SQLState +"\
"
;
    }
    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"] +"\
\
";
            string rowdata2 = row["
NO_IDENT_2"].ToString().Replace("","");
            if (rowdata2 !="
")
                liste_No_Ident += rowdata2 +"
";// +"NOMBRE =" + row["nbr_doublon"] +"\
\
";


        }
    }
}
catch (Exception e)
{
}


对于您要实现的目标,可以保存并集。将查询更改为

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

您可以保持循环不变。

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

1
2
3
4
5
6
7
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})

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


将查询更改为此:

1
2
3
4
5
6
7
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})

并将您的循环更改为此:

1
2
3
4
5
6
7
8
9
    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"] +"\
\
";
    }

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

1
2
3
4
5
6
7
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})

在这里,我们在每个查询中都创建了一个虚拟列,以用作其他数据集中不存在的列的占位符。

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

1
2
3
4
5
6
7
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})

在这里,我们将结果中的同一列用于相似的数据,并添加了一个新列以帮助我们区分数据的来源。如果您不在乎,则可以始终删除"源"列。


UNION的工作方式是结果集仅具有第一个SELECT的列名,但是所有行(已删除重复项)...因此,您不能按名称NO_IDENT_2来访问列值...即使数据来自UNION

中的第二个SELECT,列名称仍将为NO_IDENT_1

您可以通过访问thisTable.Columns.Count进行检查-您正在使用的SELECT的值将为1。