Как я могу вставить значения из одной таблицы в другую на основе последовательного nr?
Здравствуйте,В настоящее время я пытаюсь вставить некоторые данные из одной таблицы (RegisterStudent) в другую в режиме реального времени.Это означает,что у меня есть кард-ридер,и когда студент проводит картой по кард-ридеру,невидимое текстовое поле с фокусом возьмет серийный номер с карты,проверит значение с базой данных и,если карта находится в системе, покажет информацию об этом студенте вместе с датой прибытия, датой отъезда(когда он проведет второй раз, чтобы войти в журнал) и hoursSpent, который показывает общее количество часов, потраченных на курс.Теперь это мои 2 таблицы:
CREATE TABLE [dbo].[AttendanceList] ( [sNr] INT NOT NULL, [SN] CHAR (10) NOT NULL, [fName] NVARCHAR (MAX) NOT NULL, [lName] NVARCHAR (MAX) NOT NULL, [dateArrival] TIMESTAMP NOT NULL, [dateDeparture] DATETIME NOT NULL, [hoursSpent] FLOAT NOT NULL, PRIMARY KEY CLUSTERED ([sNr] ASC), CONSTRAINT [FK_AttendanceList_ToTable] FOREIGN KEY ([SN]) REFERENCES [dbo].[RegisterStudent] ([SN]) );
CREATE TABLE [dbo].[RegisterStudent] ( [SN] CHAR (10) NOT NULL, [sNr] INT NOT NULL, [fName] NVARCHAR (MAX) NOT NULL, [lName] NVARCHAR (MAX) NOT NULL, [semester] INT NULL, PRIMARY KEY CLUSTERED ([SN] ASC) );
Теперь я хочу взять SN,sNr,fName,lName без семестра из RegisterStudent и вставить его в AttendanceList на основе серийного nr(SN).Другие значения из списка AttendanceList(dateArrival,dateDeparture и hoursSpent)будут обновляться автоматически.Моя проблема заключается в том,что когда я провожу пальцем по карте, чтобы посмотреть, работает ли она, я получаю ошибку в cmd.ExecuteNonQuery (), который утверждает, что запрос не был успешным.Как я могу заставить его работать должным образом?Это функция для вставки данных:
public void GetStudentData(object param) { SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\user0909\Documents\AttendanceListStudents.mdf;Integrated Security=True;Connect Timeout=30"); try { conn.Open(); SqlCommand cmd = new SqlCommand("insert into AttendanceList(sNr,SN,fName,lName,dateArrival,dateDeparture,hoursSpent) select sNr,SN,fName,lName from RegisterStudent where SN=SN", conn); cmd.Parameters.AddWithValue("@SN", SqlDbType.Char).Value = SerialN; cmd.Parameters.AddWithValue("@sNr", SqlDbType.Int).Value = studentNr; cmd.Parameters.AddWithValue("@fName", SqlDbType.NVarChar).Value = firstName; cmd.Parameters.AddWithValue("@lName", SqlDbType.NVarChar).Value = lastName; cmd.Parameters.AddWithValue("@dateArrival", SqlDbType.DateTime).Value = dateT; cmd.Parameters.AddWithValue("@dateDeparture", SqlDbType.DateTime).Value = departure; cmd.Parameters.AddWithValue("@hoursSpent", SqlDbType.Float).Value = hoursSpent; cmd.ExecuteNonQuery();//here I get the error } catch (Exception ex) { MessageBox.Show(ex.StackTrace); } }
Что я уже пробовал:
Я перепробовал все, что изображено, плюс другой запрос с внутренним соединением и linq.
ВИРТУАЛЬНАЯ ПАМЯТЬ:
private string SerialN; public string SNr { get { return SerialN; } set { if (SerialN != value) { SerialN = value; NotifyPropertyChanged("SNr"); } } } private int studentNr; public int StudentNR { get { return studentNr; } set { if (studentNr != value) { studentNr = value; NotifyPropertyChanged("StudentNR"); } } } private String firstName; public String FName { get { return firstName; } set { if (firstName != value) { firstName = value; NotifyPropertyChanged("FName"); } } } private String lastName; public String LName { get { return lastName; } set { if (lastName != value) { lastName = value; NotifyPropertyChanged("LName"); } } } public String FullName { get { return string.Format("{0} {1}", FName, LName); } } private DateTime dateT = DateTime.Now; public DateTime StartDate { get { return dateT; } set { dateT = value; NotifyPropertyChanged("StartDate"); } } private DateTime departure = DateTime.Now; public DateTime DepartureTime { get { return departure; } set { departure = value; NotifyPropertyChanged("DepartureTime"); } } private double hoursSpent; public double HoursSpent { get { return departure.Subtract(dateT).TotalHours; } }
Конструктор:
showStudents = new DelegateCommand(GetStudentData);
и команда делегата:
private DelegateCommand showStudents; public DelegateCommand ShowStudents { get { return showStudents; } set { if (showStudents != value) { showStudents = value; NotifyPropertyChanged("ShowStudents"); } } }
Это привязка в представлении:
<Window.DataContext> <local:AttendanceListViewModel/> </Window.DataContext> <Grid Background="#2e3137"> <TextBox HorizontalAlignment="Left" Height="31" Margin="171,212,0,0" TextWrapping="Wrap" Text="{Binding FilterString}" VerticalAlignment="Top" Width="334"/> <Button Content="Search" HorizontalAlignment="Left" Margin="569,197,0,0" VerticalAlignment="Top" Width="104" Height="47"/> <DataGrid HorizontalAlignment="Left" ItemsSource="{Binding Items}" Name="grdStudents" Height="433" Margin="0,287,0,0" VerticalAlignment="Top" Width="792"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding SNr}" Width="100" Header="Serial no." /> <DataGridTextColumn Binding="{Binding StudentNR}" Width="100" Header="Student no."/> <DataGridTextColumn Binding="{Binding FullName}" Width="100" Header="Name"/> <DataGridTextColumn Binding="{Binding StartDate,StringFormat=\{0:dd.MM.yy HH:mm:ss\}}" Width="100" Header="Arrival time"/> <DataGridTextColumn Binding="{Binding DepartureTime,StringFormat=\{0:dd.MM.yy HH:mm:ss\}}" Width="100" Header="Departure time"/> <DataGridTextColumn Binding="{Binding HoursSpent,StringFormat=\{0:HH:mm\}}" Width="100" Header="Total hours"/> <DataGridTemplateColumn Header="Edit Row"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Name="editBtn" Content="Edit" Click="editBtn_Click" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Delete Row"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="Delete" Name="deleteBtn" Command="{Binding Path=DeleteCommand}" Click="deleteBtn_Click" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> <TextBox HorizontalAlignment="Left" Text="{Binding Path=SNr}" Name="txtBoxFocus" ss:EnterKeyHelpers.EnterKeyCommand="{Binding ShowStudents}" Height="23" Margin="277,259,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/> </Grid>