Получение данных из запроса OleDb, не отображаемого в MessageBox - PullRequest
0 голосов
/ 16 декабря 2009

Я не получаю ошибок исключения с приведенным ниже кодом, который может означать, что с моим оператором sql нет проблем. Однако при попытке проверить, возвращает ли оно какое-либо значение, я передаю возвращенные элементы в строковое значение и пытаюсь отобразить его в окне сообщения.

Проблема, с которой я сталкиваюсь, состоит в том, что в окне сообщения отображается только имя столбца, а не данные, запрошенные из таблицы.

в чем может быть проблема? и, пожалуйста, совет, если есть лучший способ обойти это ...

    public void DisplayPurchase(OleDbConnection mDB)
    {
        openDB();
        string sqlQuery;
        OleDbCommand cmd;
        OleDbDataReader rdr;



        sqlQuery = "SELECT CustomerTable.[Youth ID], CustomerTable.Firstname, " +
            "CustomerTable.Lastname, Youth.Purchaseid, Youth.NumbersOfSport, " + 
            "Youth.Price, Youth.TotalCostOfTraining, Youth.PercentageDiscount, " +
            "Youth.AmountDue, Youth.DatePurchased" +
            " FROM CustomerTable, Youth WHERE Youth.YouthID = CustomerTable.[Youth ID]" +
            " AND CustomerTable.[Youth ID] = 7";

        try
        {
            cmd = new OleDbCommand(sqlQuery, mDB);

            rdr = cmd.ExecuteReader();
            if (rdr.HasRows)
            {
                qtyInt1 = (int)rdr["Youth.NumbersOfSport"];
                youthInt1 = (int)rdr["CustomerTable.[Youth ID]"];
                firstStr1 = (string)rdr["CustomerTable.Firstname"];
                purStr1 = (string)rdr["Youth.Purchaseid"];
                lastStr1 = (string)rdr["CustomerTable.Lastname"];
                priceStr1 = (string)rdr["Youth.Price"];
                totalCstStr1 = (string)rdr["Youth.TotalCostOfTraining"];
                discountStr1 = (string)rdr["Youth.PercentageDiscount"];
                amtDueStr1 = (string)rdr["Youth.AmountDue"];
                //purDate1 = (DateTime)rdr["Youth.DatePurchased"];

                MessageBox.Show(firstStr1.ToString());

                closeDB();

            }
            else
            {
                MessageBox.Show("Reader has no rows");
                closeDB();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }


    }

Спасибо

Ответы [ 5 ]

3 голосов
/ 16 декабря 2009

Я почти уверен, что вам нужно вызвать rdr.Read (), прежде чем вы сможете получить к нему какие-либо данные. Итак, добавьте это в качестве первой строки после if (rdr.HasRows ())

1 голос
/ 16 декабря 2009

Вам нужно вызвать Read () на считывателе, чтобы read первый ряд.

if(rdr.HasRows) {
    rdr.Read();
    ...

С наилучшими пожеланиями,
Fabian

0 голосов
/ 17 декабря 2009

Удивительно, как это работает ... Прежде всего, я хотел бы поблагодарить всех, кто внес вклад в решение этой проблемы. Я очень благодарен за каждый опубликованный алфавит.

sqlQuery = "SELECT Youth.YouthID, Имя, Фамилия, NumbersOfSport, Цена, TotalCostOFTraining, PercentageDiscount, Buyid, AmountDue, DatePurchased FROM CustomerTable, Youth WHERE CustomerTable.YouthID = Youth.YouthID AND Youth.YouthID =" YouthTy );

        try
        {
            cmd = new OleDbCommand(sqlQuery, mDB);

            rdr = cmd.ExecuteReader();
            if (rdr.HasRows)
            {
                rdr.Read();
                qtyInt1 = (int)rdr["NumbersOfSport"];
                youthInt1 = (int)rdr["YouthID"];
                firstStr1 = (string)rdr["Firstname"];
                purInt1 = (int)rdr["Purchaseid"];
                lastStr1 = (string)rdr["Lastname"];
                priceStr1 = (string)rdr["Price"];
                totalCstStr1 = (string)rdr["TotalCostOfTraining"];
                discountStr1 = (string)rdr["PercentageDiscount"];
                amtDueStr1 = (string)rdr["AmountDue"];
                purDate1 = (DateTime)rdr["DatePurchased"];



                closeDB();

            }
            else
            {
                MessageBox.Show("Reader has no rows");
                closeDB();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }


    }

Мне пришлось вызвать rdr.read (); функции, а также взятие таблицы, ссылающейся на столбцы базы данных, и каждая помощь пришла из разных источников ..... это потрясающе... Спасибо всем ...

0 голосов
/ 16 декабря 2009

Удалить имена таблиц при извлечении данных:

qtyInt1 = (int)rdr["NumbersOfSport"];
youthInt1 = (int)rdr["Youth ID"];  // You may need to rename this one in the query
firstStr1 = (string)rdr["Firstname"];
purStr1 = (string)rdr["Purchaseid"];
lastStr1 = (string)rdr["Lastname"];
priceStr1 = (string)rdr["Price"];
totalCstStr1 = (string)rdr["TotalCostOfTraining"];
discountStr1 = (string)rdr["PercentageDiscount"];
amtDueStr1 = (string)rdr["AmountDue"];
0 голосов
/ 16 декабря 2009

Вы пробовали:

firstStr1 = (string)rdr["Firstname"];

Имя поля в устройстве чтения данных обычно не включает префикс имени таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...