KingDolly Ответов: 2

Как объединить несколько таблиц и отобразить их в одной сетке данных с помощью C# winforms


У меня есть приложение, которое хранит результаты студентов с 1 по 9 класс. каждый класс имеет 3 термина, так что есть 27 таблиц в общей сложности для хранения оценок студента. Ученик может начать с любого класса, поэтому может быть, что у ученика есть результаты для 4-9 класса, потому что он начал с 4 класса. Итак, мои таблицы таблицы называются следующим образом: Grade1FT,Grade1ST,Grade1TT,Grade2FT,Grade2ST,Grade3TT и т. д. То есть он следует такому шаблону прямо к Grade9FT,Grade9ST,Grade9TT. Теперь каждый класс таблица состоит из 10 столбцов, так что имена столбцов идентификаторов,английский,математика,науки,Социальные,РМЭ,ИКТ,черчения,истории и географии.
У меня есть еще одна таблица под названием register, где все студенты регистрируют свои имена и получают свои уникальные идентификаторы.

Мне нужна возможность, когда студент может искать все свои результаты с 1 - го по 9-й класс и отображать их в одном представлении datagrid, используя свой уникальный идентификатор студента, который он вводит в текстовое поле. Я вставил пример кода, пытаясь запустить его, но получил сообщение об ошибке "ошибка рядом слева"

Вот что я пытался сделать, но безуспешно.

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

private void btnsearchall_Click(object sender, EventArgs e)
        {
            cn.Open();
            cmd = new SqlCommand(" SELECT register.StudentId LEFT JOIN grade1FT_results,grade1ST_results,grade1TT_results,grade2FT_results,
grade2ST_results,grade2TT_results,grade3FT_results,grade3ST_results,
grade3TT_results,
grade4FT_results, grade4ST_results,grade4TT_results,grade5FT_results,
grade5ST_results,grade5TT_results,
grade6FT_results,grade6ST_results,grade6TT_results, grade7FT_results,grade7ST_results,grade7TT_results,
grade8FT_results,grade8ST_results,grade8TT_results ,grade9FT_results,
grade9ST_results,
grade9TT_results WHERE StudentId=@Id ", cn);
            cmd.Parameters.AddWithValue("@Id", txtid.Text);
            cmd.ExecuteNonQuery();

            DataTable dtable;
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            dtable = new DataTable();
            da.Fill(dtable);
            BindingSource dsource = new BindingSource();

            dsource.DataSource = dtable;
            datagrid.DataSource = dsource;
            da.Update(dtable);

            cn.Close();

           

        }

2 Ответов

Рейтинг:
2

an0ther1

Оператор SELECT работает следующим образом;

SELECT
<Column Names>
FROM
<Table Name> <alias>
<Join Type> JOIN <Table Name> <alias> ON <join condition>
WHERE
<Conditions>

Пример этого выглядит следующим образом;
SELECT
a.StudentName, b.Grade AS Yr1Term1, c.Grade AS Yr1Term2
FROM
Register a
LEFT JOIN grade1FT_results b ON a.StudentId = b.StudentId
LEFT JOIN grade1ST_results c ON a.StudentId = c.StudentId
WHERE
a.StudentId = 123

Для получения полного описания инструкции Select обратитесь к следующей ссылке; инструкция Select[^]

Ошибка, которую вы получаете, заключается в том, что вы неправильно указали свой оператор FROM

с уважением


Рейтинг:
12

#realJSOP

0) Ваш запрос не будет выполняться.

1) я бы создал представление в базе данных, которое выполняет объединение всех этих таблиц

SELECT * FROM mydatabase.dbo.grade1FT_results
UNION ALL SELECT * FROM mydatabase.dbo.grade1ST_results
...
...
UNION ALL SELECT * FROM mydatabase.dbo.grade9TT_results


...и запрос в ваш код будет в конечном итоге глядя, что-то вроде этого:

SELECT * FROM mydatabase.dbo.myview WHERE StudentID = @id


Имейте в виду, что я предполагаю, что все таблицы имеют точно такие же схемы, но если это не так, вам придется выбирать каждый отдельный столбец по имени вместо использования SELECT *

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


KingDolly

Большое спасибо. Это сработало.