Eliza Maria Ответов: 1

Как я могу вставить значения из двух таблиц в третью в winforms?


Здравствуйте,у меня есть вопрос относительно вставки из одной таблицы в другую на основе значения третьей таблицы.У меня есть 3 стола:
CREATE TABLE [dbo].[AttendanceList](
	[sNr] [int] IDENTITY(1,1) NOT NULL,
	[SN] [char](10) NOT NULL,
	[fName] [nvarchar](max) NOT NULL,
	[lName] [nvarchar](max) NOT NULL,
	[dateArrival] [datetime] NOT NULL,
	[dateDeparture] [datetime] NULL,
	[Attending] [bit] NULL,
	[CourseID] [nvarchar](50) NULL,
	[Departed] [bit] NULL,
PRIMARY KEY CLUSTERED 
(
	[sNr] ASC
CREATE TABLE [dbo].[RegisterStudent](
	[SN] [char](10) NOT NULL,
	[sNr] [int] NOT NULL,
	[fName] [nvarchar](max) NOT NULL,
	[lName] [nvarchar](max) NOT NULL,
	
	
PRIMARY KEY CLUSTERED 
(
	[SN] ASC
CREATE TABLE [dbo].[StudentCourses](
	[StudentId] [char](10) NOT NULL,
	[CourseId] [char](10) NOT NULL
) ON [PRIMARY]

Я бы хотел, чтобы моя форма AttendanceList показывала всех студентов из RegisterStudent в AttendanceList на основе CourseId(который хранится в третьей таблице StudentCourses из-за того, что у студента может быть несколько курсов).Как это можно сделать с помощью sql?Заранее спасибо.

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

Это метод, который я использую при загрузке данных в таблицу списка посещаемости:
private void LoadData()
       {

           string str = "insert into AttendanceList(SN,sNr,fName,lName) select SN,sNr,fName,lName from RegisterStudent p inner join StudentCourses c where  c.CourseId='" + cmbClassId.SelectedValue.ToString() + "'";
           da = new SqlDataAdapter(str, connstr);
           ds = new DataSet();
           da.Fill(ds);
           dt = ds.Tables[0];
           bi.DataSource = dt;
           dg.DataSource = bi;
           dg.ClearSelection();
           txtStudentId.Focus();
           var count = Convert.ToInt32(dg.Rows.Count.ToString())-1;
           txtCount.Text = count.ToString();
       }

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

string str = "insert into AttendanceList(SN,sNr,fName,lName) select SN,sNr,fName,lName from RegisterStudent p inner join StudentCourses c where  c.CourseId = @CourseId";
da = new SqlDataAdapter(str, connstr);
da.SelectCommand.Parameters.AddWithValue("@CourseId", cmbClassId.SelectedValue);

1 Ответов

Рейтинг:
1

Vinod Jangle

Вам не хватает соответствующего столбца в StudentCourses стол, чтобы присоединиться к нему RegisterStudent например, если SN означает номер студента, то вам нужно иметь этот столбец доступным в таблице. StudentCourses кроме того, вы можете использовать приведенный ниже запрос для выбора и вставки в таблицу AttendanceList.

CREATE TABLE [dbo].[RegisterStudent](
	[SN] [char](10) NOT NULL, --Primary key assuming its student number
	[sNr] [int] NOT NULL,
	[fName] [nvarchar](max) NOT NULL,
	[lName] [nvarchar](max) NOT NULL,
	
	
PRIMARY KEY CLUSTERED 
(
	[SN] ASC
CREATE TABLE [dbo].[StudentCourses](
        [SN] [char](10) NOT NULL, -- Foreign key from RegisterStudent
	[StudentId] [char](10) NOT NULL,
	[CourseId] [char](10) NOT NULL
) ON [PRIMARY]



*КОД ОБНОВЛЕНИЯ НИЖЕ-

private void LoadData()
{

   string str = "insert into AttendanceList(SN,sNr,fName,lName) select SN,sNr,fName,lName from RegisterStudent p inner join StudentCourses c on c.SN = p.SN where  c.CourseId=@CourseId";
 cmd.Parameters.AddWithValue("@CourseId", cmbClassId.SelectedValue);

 cmd.ExecuteNonQuery(); // This will insert data in AttendanceList table

  using(SqlCommand cmd1 = new SqlCommand("select * from AttendanceList","<YOUR_CONNECTION_STRING>"))
  {
     cmd1.CommandType = SqlCommandType.Text;
     cmd1.CommandTimeout = 190;
     
   da = new SqlDataAdapter(cmd1);
   ds = new DataSet();
   da.Fill(ds);
   dt = ds.Tables[0]; // you will get AttendanceList data to show in data table object
   ....
  }
  ...
}


Eliza Maria

Спасибо за ваш ответ.Я пытался, но получаю эту ошибку"System.NullReferenceException: 'ссылка на объект не установлена на экземпляр объекта".

Система.Окна.Формы.Элементе управления listcontrol.Выбранное значение.получить возвращенный null.
"

Eliza Maria

А StudentId-это FK для RegisterStudent

[no name]

при первой команде "STR" он вставит данные в вашу таблицу, а затем вам нужно будет вытащить данные обратно, чтобы показать их в таблице/элементе управления. Обновил код сейчас и должен был заметить это раньше :)