candijen Ответов: 1

Как мне отобразить все значения из БД? C# ASP.NET


Когда я выбираю из выпадающего списка только одну запись из базы данных в списке флажков, но в базе данных есть еще несколько записей с тем же именем субъекта, но они не отображаются. Выпадающий список заполняется с помощью таблицы subjects, а список checkboxlist отображается с помощью данных из таблицы CLO. пожалуйста помочь.

Это мой код.

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        { CheckBoxList1.Items.Clear(); }

        String strConnString = ConfigurationManager.ConnectionStrings["facultylogConnectionString"].ConnectionString;
        String strQuery = "Select CourseOutcomes from CLO,subjects where " + " SubjectName = @Subject_Name";
        SqlConnection con = new SqlConnection(strConnString);
        SqlCommand cmd = new SqlCommand();
        cmd.Parameters.AddWithValue("Subject_Name", DropDownList1.SelectedItem.Value);
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = strQuery;
                cmd.Connection = con;
                con.Open();
                using(SqlDataReader sdr = cmd.ExecuteReader())
                {
                     sdr.Read();
                     ListItem item = new ListItem();
                     item.Text = sdr["CourseOutcomes"].ToString();
                     CheckBoxList1.Items.Add(item);
                }
                con.Close();
                
            }


Что я уже пробовал:

Я также пробовал использовать цикл while, но он отображает одну и ту же запись базы данных 5 раз.

{ CheckBoxList1.Items.Clear(); }

       String strConnString = ConfigurationManager.ConnectionStrings["facultylogConnectionString"].ConnectionString;
       String strQuery = "select CourseOutcomes from CLO,subjects where " + " SubjectName = @Subject_Name";
       SqlConnection con = new SqlConnection(strConnString);
       SqlCommand cmd = new SqlCommand();
       cmd.Parameters.AddWithValue("Subject_Name", DropDownList1.SelectedItem.Value);
       cmd.CommandType = CommandType.Text;
       cmd.CommandText = strQuery;
       cmd.Connection = con;
       try
       {
           con.Open();
           SqlDataReader sdr = cmd.ExecuteReader();
           while (sdr.Read())
           {
               ListItem item = new ListItem();
               item.Text = sdr["CourseOutcomes"].ToString();
               CheckBoxList1.Items.Add(item);

           }
       }
       catch (Exception ex)
       {
           throw ex;
       }
       finally
       {
           con.Close();
           con.Dispose();
       }

Richard MacCutchan

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

Richard Deeming

catch (Exception ex)
{
    throw ex;
}

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

Если вам действительно нужно повторно создать исключение, просто используйте throw; вместо throw ex;:
catch (Exception ex)
{
    throw;
}

Но в этом случае, поскольку вы ничего не делаете с исключением, просто удалите catch блок.

finally
{
    con.Close();
    con.Dispose();
}

Если вы обернете свой SqlConnection, SqlCommand, и SqlDataReader объекты в using блок, тебе это не понадобится finally блок.
using (SqlConnection con = new SqlConnection(strConnString))
using (SqlCommand cmd = new SqlCommand())
{
    cmd.Parameters.AddWithValue("Subject_Name", DropDownList1.SelectedItem.Value);
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = strQuery;
    cmd.Connection = con;
    
    con.Open();
    using (SqlDataReader sdr = cmd.ExecuteReader())
    {
        while (sdr.Read())
        {
            ListItem item = new ListItem();
            item.Text = sdr["CourseOutcomes"].ToString();
            CheckBoxList1.Items.Add(item);
        }
    }
}

candijen

Спасибо я удалил блок try но не могу понять почему
когда я выбираю Subject_Name из выпадающего списка, я хочу, чтобы он дал мне CourseOutcomes из таблицы CLO в соответствии с именами субъектов в флажках, но он дает мне только один CourseOutcome, но в таблице есть еще несколько для того же имени субъекта.


вот эти две таблицы

Создайте таблицу [dbo].[тематика] (
[Subject_Code] NVARCHAR (50) NOT NULL,
[имя субъекта] NVARCHAR (50) NOT NULL,
Первичный ключ КЛАСТЕРИЗОВАН ([Subject_Code] ASC)
);


Создайте таблицу [dbo].[Кло] (
[Id] INT NOT NULL,
[Имя субъекта] NVARCHAR (50) NOT NULL,
[CourseOutcomes] NVARCHAR (500) NOT NULL,
Кластеризованный первичный ключ ([Id] ASC)
);

Содержание выглядит примерно так

Subject_Code Subject_Name
ETM203 последние тенденции в IT
ETM302 технологии управления
ETM316 цифровой маркетинг
ISM303 потребительское поведение
STM302 Программная инженерия


Идентификатор subjectname в CourseOutcomes
1 Последние тенденции в ИТ объясняют основы последних тенденций в технологии.
2 последние тенденции в ИТ описывают различные приложения последних тенденций.
3 последние тенденции в ИТ объясняют важность развития технологий.
4 последние тенденции в ИТ обсуждаются ключевые моменты и теоретический аспект.
5 цифровой маркетинг опишите основы цифрового медиа-маркетинга.
6 Цифровой Маркетинг Привет
7 Цифровой Маркетинг Привет


DerekT-P

Какова ваша структура d/b? Ваш SQL-оператор
Выберите CourseOutcomes от Кло,субъектах, где subjectname в = @subjectname в

Таким образом, вы запрашиваете две отдельные таблицы, но не определяете отношения между ними. Запустите этот запрос в ManagementStudio или любом другом инструменте, который вы используете, и вы увидите результаты, которые получает ваш код. И, как сказал Ричард м выше, использование отладчика для пошагового просмотра кода и изучения того, что на самом деле происходит, обычно является лучшим способом понять, что вы просите свой код сделать!

candijen

вот эти две таблицы

Создайте таблицу [dbo].[тематика] (
[Subject_Code] NVARCHAR (50) NOT NULL,
[имя субъекта] NVARCHAR (50) NOT NULL,
Первичный ключ КЛАСТЕРИЗОВАН ([Subject_Code] ASC)
);


Создайте таблицу [dbo].[Кло] (
[Id] INT NOT NULL,
[Имя субъекта] NVARCHAR (50) NOT NULL,
[CourseOutcomes] NVARCHAR (500) NOT NULL,
Кластеризованный первичный ключ ([Id] ASC)
);

Содержание выглядит примерно так

Subject_Code Subject_Name
ETM203 последние тенденции в IT
ETM302 технологии управления
ETM316 цифровой маркетинг
ISM303 потребительское поведение
STM302 Программная инженерия


Идентификатор subjectname в CourseOutcomes
1 Последние тенденции в ИТ объясняют основы последних тенденций в технологии.
2 последние тенденции в ИТ описывают различные приложения последних тенденций.
3 последние тенденции в ИТ объясняют важность развития технологий.
4 последние тенденции в ИТ обсуждаются ключевые моменты и теоретический аспект.
5 цифровой маркетинг опишите основы цифрового медиа-маркетинга.
6 Цифровой Маркетинг Привет
7 Цифровой Маркетинг Привет


Я даже не знаю, что с ними делать.

но моя проблема заключается в том, что когда я выбираю Subject_Name из выпадающего списка, я хочу, чтобы он дал мне CourseOutcomes из таблицы CLO в соответствии с именами субъектов в флажках, но он дает мне только один CourseOutcome, но есть еще в таблице для того же имени субъекта

1 Ответов

Рейтинг:
1

DerekT-P

Ну, это не похоже на то, что вам вообще нужна таблица Subject_name, так как Subject_Name реплицируется в каждой таблице (почему??) и вы не ссылаетесь на какие-либо другие данные из таблицы субъектов. Я думаю, что ваш запрос просто должен быть "Select courseoutcomes from CLO where SubjectName = @SubjectName"(Я понятия не имею, почему ты ломаешь свой strQuery это, по крайней мере, даст вам нужные строки из базы данных. Затем, когда вы используете свое время... loop вы будете подбирать каждую строку и создавать элемент в выпадающем списке. Таким образом, ваш окончательный код может быть упрощен до чего-то вроде:

CheckBoxList1.Items.Clear();
String strConnString = ConfigurationManager.ConnectionStrings["facultylogConnectionString"].ConnectionString;
String strQuery = "select CourseOutcomes from CLO where SubjectName = @Subject_Name";
using (SqlConnection con = new SqlConnection(strConnString)) {
    SqlCommand cmd = new SqlCommand();
    cmd.Parameters.AddWithValue("Subject_Name", DropDownList1.SelectedItem.Value);
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = strQuery;
    cmd.Connection = con;
    con.Open();
    using (SqlDataReader sdr = cmd.ExecuteReader()) {
        while (sdr.Read())
        {
            CheckBoxList1.Items.Add(new ListItem(sdr["CourseOutcomes"].ToString());
        }
    }
    con.Close();
}
(I've typed the above straight into CP so may have got brackets unbalanced or made typos, hopefully you get the idea). As previously, if your code doesn't give you the results you want, then step through it in the debugger to understand WHY it's not doing what you expect. You say (about the data tables) "I'm not really sure what to do with them" ... then learn SQL, at least its basics, before you start programming with SQL databases. Experiment with SELECT queries in the environment of something like SSMS, or HeidiSQL, or even just link to the database with Access. Learn how relational databases work and get comfortable with SQL - it's not hard (at least not at this level!)
В приведенном выше примере я обошелся без блока try...catch, поскольку вы все равно не обрабатываете никаких исключений, так что он действительно предлагает мало чего, кроме, возможно, закрытия соединения в "finally". Как было предложено выше, я поместил эту связь в свою собственную using блокируйте (и явно закрывайте его при успешном выполнении), так как это гарантирует, что он будет правильно очищен, что бы ни случилось.


candijen

Спасибо, я постараюсь. :)