Daniel Andrei Popescu Ответов: 1

Как я могу вставить значения из одной таблицы в другую на основе последовательного 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>

1 Ответов

Рейтинг:
1

CHill60

Этот запрос выглядит неправильно, попробуйте

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);
Остальные параметры бессмысленны, вам нужно либо заполнить таблицу из select, который у вас есть, а затем обновить строку (в отдельном действии), изменить select или захватить информацию и установить соответствующие параметры.
Вот один из вариантов (непроверенный)
SqlCommand cmd = new SqlCommand("insert into AttendanceList(sNr,SN,fName,lName,dateArrival,dateDeparture,hoursSpent) select sNr,SN,fName,lName,
@dateArrival as dataArrival, @dateDeparture as dateDeparture, @hoursSpent as hoursSpent from RegisterStudent where SN=@SN", conn);

cmd.Parameters.AddWithValue("@SN", SqlDbType.Char).Value = SerialN;
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();

Если это все еще не работает, то дайте нам точную формулировку ошибки

[Edit] попробуйте изменить добавление параметров на
cmd.Parameters.AddWithValue("@SN", SerialN);
cmd.Parameters.AddWithValue("@dateArrival",dateT);
cmd.Parameters.AddWithValue("@dateDeparture",departure);
cmd.Parameters.AddWithValue("@hoursSpent", hoursSpent);
cmd.ExecuteNonQuery();


Daniel Andrei Popescu

Большое вам спасибо за ваш ответ.Я попробовал,как вы предложили, но когда я отлаживаю его, он все равно дает мне нулевые значения.Я также попытался установить SN в качестве серийного nr,чтобы проверить, может быть, это как-то связано с привязкой, но нет.Это не работает в любом случае.Это ошибка, которую я получаю:
"Параметризованный запрос '(@SN nvarchar(4000) @sNr int,@fName nvarchar(4000),lName nvarch' ожидает параметр '@SN',который не был указан).Я считаю,что это происходит потому, что я не объявлял его как null, что и происходит, когда я его отлаживаю.

CHill60

Я обновил свое решение. Но убедитесь, что в каждом параметре есть действительные значения.

Daniel Andrei Popescu

- Благодарю вас,сэр.Я понимаю,и в таблице RegisterStudent есть значения.Я попробовал подход,который вы предложили, но он все еще не может прочитать серийный номер.Я также просмотрел переплет, чтобы проверить, не упустил ли я чего-нибудь.Я также обновил вопрос с привязкой.С наилучшими пожеланиями!