Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как решить такое дело, Выбор данных из базы 
:(
    Опции темы
Colloseum
Дата 8.8.2006, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



Почему следующий код не работает, БД Аксес 2003.:

Код

int name = -1;

while(myDataReader.Read())
{            {

    int name2 = (int)myDataReader["District"];
    
    if ( name != name2)
    {

        Console.WriteLine(myDataReader["District"].ToString());
        name = (int)myDataReader["ku"];

    }
}


Необходимо отчет сделать.
Но само собой немного это обработать нужно, не вываливать же сырые данные.

Здесь поле District повторяется раз по 10-20, я его if'ом вылавливаю когда оно изменяется в первый раз и вывожу (в запросе есть строка ORDER BY District).
Сделал такое через string переменную, работает на ура, но сравнивать строки ведь дольше!? Да и может же понадобится сложить два любых значения.
Неужели надо через ExecuteScalar делать, но так-же неудобно?
PM MAIL   Вверх
arilou
Дата 8.8.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 4
Всего: 61



Colloseum, 

1. Какая именно ошибка происходит?
2. Какой тип у поля District в таблице?
3. И наконец, не совсем понятно, чего ты пытаешься добиться  smile 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Colloseum
Дата 8.8.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



1. Какая именно ошибка происходит?

      Исключение.
      Вот еще из консоли вывод
       Unhandled Exception: System.InvalidCastException: Specified cast is not valid.
       at InWORDProject3.Class.Main(String[] args) in c:\Documents and ...


2. Какой тип у поля District в таблице?

      Целое и реально в диапазоне от 1 до 113.

3. И наконец, не совсем понятно, чего ты пытаешься добиться

Значит поподробнее.

Код

DBNumr    District    CnA
318780    1    10613    
204747    1    10413    
201906    1    10613    
208147    1    10413    
319017    1    10413    
200072    2    10413    
318873    2    10413    
208104    3    10413    
318866    3    10413    


Номеру District соответствует ФИО или район из другой таблицы. 
Т.К. это я отчет делаю то ессесно хочу чтоб выводилось все это красиво.
Значить логика такая name до цикла содержит какое-то значение (любое лишь бы не совпадало с табличным).
Когда начинается считывание данных то новой переменной name2 присваевается первое значение District т.е. 1

if (name != name2) - проверяет не совпадают ли раз не совпадает, то выводим ФИО или район из другой таблицы по вкусу.
И присваеваем 1 к name 
Код

Сорри за невнимательность там ошибка в коде.
name = (int)myDataReader["District "];


При втором проходе name = name2 и ФИО или район не пишем до тех пор пока District не изменится на 2.

Если так то работать будет, но наверное будет медленнее.
Код

string name = -1;

while(myDataReader.Read())
{      
    string name2 = myDataReader["District"].ToString());
    
    if ( name != name2)
    {

        Console.WriteLine(myDataReader["District"].ToString());
        name = myDataReader["District"].ToString();

    }
}


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

Это сообщение отредактировал(а) Colloseum - 8.8.2006, 11:27
PM MAIL   Вверх
Exception
Дата 8.8.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 2
Всего: 186



Сомневаюсь, что так уж медленнее будет. Ведь с твоим вариантом каждый раз строка должна парситься в число, что занимает определённое время. Но если очень надо -- попробуй заменить приведение к int вызовом Convert.ToInt32(), ибо строку нельзя привести к числу, её можно сконвертировать smile .

Добавлено @ 11:38 
Также можно вызвать int.Parse(), это не имеет особого значения.

Добавлено @ 11:40 
Если я не ошибаюсь, по-видимому, в БД эта колонка имеет тип строки, а не числа smile .
PM   Вверх
arilou
Дата 8.8.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 4
Всего: 61



Все понятно. Единственное замечание. Что мешает сделать запрос таким:

Код

SELECT 
  table1.DBNumr, districts.DistrictName, table1.CnA
FROM
  table1
INNER JOIN districts ON districts.DistrictNumber=table1.District


И выводить сразу dr["DistrictName"] ?

Думаю, что в данной задаче заниматься оптимизацией сравнения интов или строк не имеет смысла. Все равно вывод на консоль по сравнению с этим всем тормозит не по детски  smile А запрос реально увеличит производительность.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.