Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 10.02.2013
Сообщений: 7

Не получается второй раз считать информацию из БД

15.02.2013, 23:13. Показов 1386. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Столкнулся с такой проблемой.
Имеется база данных в ней две таблицы Content и ListContent
Необходимо, чтобы при открытии приложения программа брала данные из ListContent и создавала вкладки
Потом в каждой вкладке создавалось оглавление на основании данных из таблицы Content

C#
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
 private void InitializePages()
        {
 
            //Создаем объект класса SqlConnection
            SqlConnection conn = new SqlConnection(connectionString);
 
            //пробуем подключится
            conn.Open();
 
            //Создаем объект класса SqlCommand в котором прописываем запрос и строку подключения
            // Дополнительные команды можно добавить так cmd.CommandText = "SELECT COUNT(Id) FROM Test";
            SqlCommand cmd = new SqlCommand("SELECT * FROM ListContent", conn);
            //Создаем коллекцию с использование класса TabPage
            var thePages = new System.Collections.Generic.List<TabPage>();
            thePages.Clear();
            tabControl1.TabPages.Clear();
            //Определяем тип, переменную и записываем в нее возвращенный результат
            cmd.CommandText = "SELECT COUNT(Id) FROM ListContent";
            Int32 countPages = (Int32)cmd.ExecuteScalar();
            //Считывает информацию из строки запроса
            cmd.CommandText = "SELECT Id,Position,Name FROM ListContent";
            
            using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
               {
 
            // Запускаем цикл создания вкладок
                   for (int i = 0; i < countPages; i++)
                   {
                       while (dr.Read())
                       { //Начинает чтение данных из объекта dr
                           TabPage Page = new TabPage() //Создает вкладку
                               {
                                   ContextMenuStrip = this.CMS_Half,
                                   AutoScroll = true,
                                   Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))),
                                   Location = new System.Drawing.Point(4, 22),
                                   Name = "tabPage" + dr[0],
                                   Padding = new System.Windows.Forms.Padding(3),
                                   Size = new System.Drawing.Size(284, 240),
                                   TabIndex = i,
                                   Text = "" + dr[2],
                                   Tag = dr[0],
                                   ToolTipText = "Перейти во вкладку",
                                   UseVisualStyleBackColor = true,
                               };
                           thePages.Insert(i, Page);
                       }
                   }
            }
                conn.Close();
                conn.Dispose();
                
                //Для каждой вкладки в коллекции TabPage
            foreach (TabPage NewPage in thePages)
            {
                InitializeTabMenu();
                tabControl1.TabPages.Add(NewPage);
                NewPage.Controls.Add(TS_tab);
                CreateLinks(NewPage.Tag.ToString());
            }
        }
 
        private void CreateLinks(string IdInList)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("SELECT * FROM Content", conn);
                cmd.CommandText = "SELECT COUNT(Id) FROM Content";
                Int32 countLinks = (Int32)cmd.ExecuteScalar();
                cmd.CommandText = "SELECT Id,IdInList,Position,FullName,ShortName FROM Content where IdInList=@Number";
                    SqlParameter param = new SqlParameter();
                    param.ParameterName = "@Number";
                    param.Value = IdInList;
                    param.SqlDbType = SqlDbType.Int;
                    cmd.Parameters.Add(param);
                    LinkLabel[] _linksArray = new LinkLabel[countLinks];
                    using (SqlDataReader dl = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        for (int i = 0; i < countLinks; i++)
                        {
                            while (dl.Read())
                            {
                                //Начинает чтение данных из объекта dr
                                _linksArray[i] = new LinkLabel(); //Создает вкладку
                                _linksArray[i].ActiveLinkColor = Color.Black;
                                _linksArray[i].AutoSize = false;
                                _linksArray[i].LinkColor = Color.Black;
                                _linksArray[i].Name = "linkLabel" + dl[0];
                                _linksArray[i].Size = new Size(200, 13);
                                _linksArray[i].TabIndex = i;
                                _linksArray[i].TabStop = true;
                                _linksArray[i].Tag = dl[0];
                                _linksArray[i].Text = "" + dl[4];
                                _linksArray[i].VisitedLinkColor = Color.Black;
                            }
                        }
                    }
 
                int GetY = 0, GetX = 20, Count = 0;
                // Задаем каждой ссылке координату и добавляем в форму
                foreach (LinkLabel NewLink in _linksArray)
                {
                    if (Count < _linksArray.Length) { Count++; GetY++; }
                    if (Count == 21) { GetX = 240; GetY = 1; }
                    if (Count == 41) { GetX = 460; GetY = 1; }
                    if (Count == 61) { GetX = 680; GetY = 1; }
                    if (Count == 81) { GetX = 900; GetY = 1; }
                    if (Count == 101) { GetX = 1120; GetY = 1; }
                    if (Count == 121) { GetX = 1340; GetY = 1; }
                    if (Count == 141) { GetX = 1560; GetY = 1; }
                    NewLink.Location = new Point(GetX, GetY * 25);
                    this.Controls.Add(NewLink);
                }
            };
        }
Все операции происходят двумя методами, но при компиляции вкладки создаются, а оглавление нет, потому что команда using (SqlDataReader dl = cmd.ExecuteReader(CommandBehavior.CloseC onnection)) не заполняется данными из базы данных и если убрать while (dl.reader()) и оставить просто dl.reader то компилятор выдает следующие сообщение об ошибке : Недопустимая попытка чтения при отсутствии данных.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.02.2013, 23:13
Ответы с готовыми решениями:

Не получается считать из файла информацию
У меня есть текстовый файл. Мне нужно считать в нем строчки, такого типа: qwert 12345 asdfghjk 213213 tgyhh 39482 Имена...

getline() (не получается считать информацию с файла)
Здравствуйте. У меня есть файл вида: volleyball 1 sports.ru 500 volleyball football Первая строка - искомый тег, вторая -...

Не получается считать информацию из файла в 2-х мерный массив (С++)
Что-то не совсем праильно работает, да и подскажите как потом поменять местами столбики со строками соответственно (т.е. 1-я строка...

6
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
16.02.2013, 00:45
Вот этот цикл
C#
1
for (int i = 0; i < countPages; i++)
похоже совсем лишний

Насколько я понимаю, вам нужно примерно это:
C#
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
tabControl1.TabPages.Clear();
var font = new Font("Microsoft Sans Serif", 8.25F, FontStyle.Regular, GraphicsUnit.Point, (byte)204);
 
using (var conn = new SqlConnection(connectionString))
{
    conn.Open();
 
    using (var command = new SqlCommand("SELECT Id, Position, Name FROM ListContent", conn))
    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        { 
            var id = (int)reader["Id"];
            var position = (int)reader["Position"];
            var name = (string)reader["Name"];
 
            var page = new TabPage()
            {
                ContextMenuStrip = this.CMS_Half,
                AutoScroll = true,
                Font = font,
                Name = "tabPage" + id,
                Padding = new Padding(3),
                Tag = id,
                Text = name,
                ToolTipText = "Перейти во вкладку",
                UseVisualStyleBackColor = true,
            };
            tabControl1.TabPages.Insert(position, page);
        }
    }
 
    conn.Close();
}
Ну и конечно, нет смысла открывать/закрывать соединение каждый раз при вызове CreateLinks. Открыли один раз, считали все что нужно, закрыли.

А создание новой вкладки лучше вынести в отдельную функцию, в которую вы бы передавали ее тег и название, в функции бы вкладка создавалась, инициализировалась и возвращалась уже готовая.
0
0 / 0 / 0
Регистрация: 10.02.2013
Сообщений: 7
16.02.2013, 10:10  [ТС]
выделяет вот эту строку var id = (int)reader["Id"]; и пишет "Заданное приведение является недопустимым." InvalidCastException
0
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
16.02.2013, 11:08
Посмотрите в отладчике чему равно reader["Id"]
Если у вас в таблице есть поле "Id", если оно целого типа и не может быть равно NULL, а так же если оно указано в SQL-запросе, то все должно работать правильно.
Скорее всего, у вас тип поля "Id" не целый, а строка например. Что конечно странно.
0
0 / 0 / 0
Регистрация: 10.02.2013
Сообщений: 7
16.02.2013, 11:25  [ТС]
В таблице у меня поле Id int64 может из-за этого
0
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
16.02.2013, 11:37
Попробуйте тогда
C#
1
var id = (long)reader["Id"];
или
C#
1
var id = Convert.ToInt64(reader["Id"]);
А чтобы не гадать лучше посмотреть все-таки чему равно reader["Id"]
0
0 / 0 / 0
Регистрация: 10.02.2013
Сообщений: 7
16.02.2013, 11:38  [ТС]
Однако спасибо за помощь, дальше буду ковыряться сам.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.02.2013, 11:38
Помогаю со студенческими работами здесь

Считать информацию из одного файла, кодировать во второй и декодировать в третий
Привет, как сделать чтобы программа работала с файлом. Т.е. брала информацию из одного, кодировала во второй и декодировала в третий? ...

Из первого файла считать информацию, обработать, а результат записать во второй
Не могу написать программу. Нужно из первого файла считать информацию, обработать, а результат показать во втором файле. Дана програма: ...

Не получается считать информацию из фаила (описать структуру с именем MARSH)
Не получается считать информацию из файла. Все остальные действия программы кроме считывания информации из файла работают нормально. ...

В первый файл записать информацию о жильцах дома, во второй - информацию о квартирах
Здравствуйте! Помогите пожалуйста. найти ошибку в программе! Необходимо написать два файла, в первый информацию о жильца дома( фио,номер...

Задание по Visual c++ 2013, Нужно создать файл, записать в него информацию, а затем по другой кнопке считать информацию из файла
Вот код записи в файл: { UpdateData(TRUE); F.open(L&quot;dat1.txt&quot;, std::ios::out); // F - файловая переменная p.god = p_god; //...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru