Я хотел бы получить данные из набора данных после множественного выбора и объединения C # - PullRequest
0 голосов
/ 26 октября 2011

Я хочу получить данные из набора данных (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)
{
}

Ответы [ 4 ]

0 голосов
/ 26 октября 2011

За то, что вы хотели бы достичь, вы можете сохранить союз. Измените ваш запрос на

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

Имейте в виду, что объединяющих запросов следует избегать, поскольку они оказывают негативное влияние на производительность.

0 голосов
/ 26 октября 2011

Вы можете объединять только те наборы данных, которые имеют одинаковые определения столбцов. Определения столбцов определяются первым набором в запросе, в этом случае первый столбец называется 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.

0 голосов
/ 26 октября 2011

Измените ваш запрос следующим образом:

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";
    }
0 голосов
/ 26 октября 2011

Способ работы UNION состоит в том, что в результирующем наборе есть только имя столбца первых SELECT, но ВСЕ строки (удалены дубликаты) ... поэтому вы не можете получить доступ к столбцу по имени NO_IDENT_2, толькозначение ... имя столбца будет по-прежнему NO_IDENT_1, даже если данные поступают со второго SELECT из UNION

, вы можете проверить это, набрав thisTable.Columns.Count - оно будет иметь значение1 для SELECT, который вы используете.

...