сохранить массив данных в одну ячейку

#c#

#c#

Вопрос:

Я хотел бы сохранить массив Days в одну ячейку, TimeIn_AM в одну ячейку, TimeOut_AM в одну ячейку, TimeIn_PM в одну ячейку и TimeOut_PM в одну ячейку

Вот мой класс и метод сохранения

 public class EmployeeSchedule
    {
        public string EmployeeID { get; set; }
        public string RecordID { get; set; }
        public Schedule[] Schedule { get; set; }
    }
    public class Schedule
    {
        public string Days { get; set; }
        public string TimeIn_AM { get; set; }
        public string TimeOut_AM { get; set; }
        public string TimeIn_PM { get; set; }
        public string TimeOut_PM { get; set; }
    }
  
  for (int i = 0; i < employeeschedule.Schedule.Length; i  )
{
  SqlCommand mycommand = new SqlCommand("WorkSchedule_Save", MyConnection);
  mycommand.CommandType = CommandType.StoredProcedure;
  mycommand.Parameters.Add("@EmployeeID", SqlDbType.VarChar).Value = employeeschedule.EmployeeID;
  mycommand.Parameters.Add("@RecordID", SqlDbType.Int).Value = employeeschedule.RecordID;
  mycommand.Parameters.Add("@Days", SqlDbType.VarChar).Value = employeeschedule.Schedule[i].Days;
  mycommand.Parameters.Add("TimeIn_AM", SqlDbType.VarChar).Value = employeeschedule.Schedule[i].TimeIn_AM;
  mycommand.Parameters.Add("TimeOut_AM", SqlDbType.VarChar).Value = employeeschedule.Schedule[i].TimeOut_AM;
  mycommand.Parameters.Add("TimeIn_PM", SqlDbType.VarChar).Value = employeeschedule.Schedule[i].TimeIn_PM;
  mycommand.Parameters.Add("TimeOut_PM", SqlDbType.VarChar).Value = employeeschedule.Schedule[i].TimeOut_PM;
}
  

Я хочу 1 EmployeeID и 1 RecordID для всего массива в классе Schedule , но когда я сохраняю его, он создает EmployeeID и RecordID для каждого данные в массиве.

  • А также, если я перемещаю EmployeeID и RecordID из цикла, он говорит stored procedure or function [WorkSchedule_Save] has too many arguments *

Вот данные, которые я хочу сохранить

 {
  "EmployeeID": "1000415",
  "RecordID": "1005",
  "Schedule": [
    {
      "Days": "Sunday",
      "TimeIn_AM": "",
      "TimeOut_AM": "",
      "TimeIn_PM": "",
      "TimeOut_PM": ""
    },
    {
      "Days": "Monday",
      "TimeIn_AM": "9:00",
      "TimeOut_AM": "12:00",
      "TimeIn_PM": "1:00",
      "TimeOut_PM": "5:00"
    },
    {
      "Days": "Tuesday",
      "TimeIn_AM": "9:00",
      "TimeOut_AM": "12:00",
      "TimeIn_PM": "1:00",
      "TimeOut_PM": "5:00"
    },
    {
      "Days": "Wednesday",
      "TimeIn_AM": "9:00",
      "TimeOut_AM": "12:00",
      "TimeIn_PM": "1:00",
      "TimeOut_PM": "5:00"
    },
    {
      "Days": "Thursday",
      "TimeIn_AM": "9:00",
      "TimeOut_AM": "12:00",
      "TimeIn_PM": "1:00",
      "TimeOut_PM": "5:00"
    },
    {
      "Days": "Friday",
      "TimeIn_AM": "9:00",
      "TimeOut_AM": "12:00",
      "TimeIn_PM": "1:00",
      "TimeOut_PM": "5:00"
    },
    {
      "Days": "Saturday",
      "TimeIn_AM": "",
      "TimeOut_AM": "",
      "TimeIn_PM": "",
      "TimeOut_PM": ""
    }
  ]
}
  

Комментарии:

1. Способ хранения данных называется FlatData, поэтому, если вы хотите изменить его, просто сохраните его в двух таблицах, которые связаны со столбцами идентификаторов.

2. @AliKianoor есть ли другой способ? например, сохранить массив в одну ячейку.

3. @sim что вы подразумеваете под ячейкой?

4. @Mohammed одна ячейка в базе данных

5. я хочу сохранить все значения массива в одной ячейке базы данных

Ответ №1:

Вы можете создать эти две таблицы

 CREATE TABLE [dbo].[EmployeeSchedule]
(
    [EmployeeID ] INT NOT NULL PRIMARY KEY IDENTITY, 
    [RecordID ] INT NOT NULL
)

  
 CREATE TABLE [dbo].[Schedule]
(
    [Days] NCHAR(50) NOT NULL, 
    [TimeIn_AM] NCHAR(50) NULL, 
    [TimeOut_AM] NCHAR(50) NULL, 
    [TimeIn_PM] NCHAR(50) NULL, 
    [TimeOut_PM] NCHAR(50) NULL, 
    [EmployeeId] INT NULL, 
    CONSTRAINT [FK_Schedule_ToEmployeeSchedule] FOREIGN KEY ([EmployeeId]) REFERENCES [EmployeeSchedule]([EmployeeID]) 
)
  

Я думаю, что лучше изменить классы на

 public class EmployeeSchedule
    {
        public string EmployeeID { get; set; }
        public string RecordID { get; set; }
        public List<Schedule> Schedules { get; set; }
    }
  
     public class Schedule
    {
        public string Days { get; set; }
        public string TimeIn_AM { get; set; }
        public string TimeOut_AM { get; set; }
        public string TimeIn_PM { get; set; }
        public string TimeOut_PM { get; set; }
    }
  

и затем, когда вы сохраняете, сохраните в EmployeeSchedule , а затем сохраните в Schedule

Ответ №2:

Вы могли бы, но обычно вы не делаете это таким образом в SQL. (Кстати, это вопрос SQL и моделирования данных, а не C #).

У вас будет несколько таблиц в соответствии с

  1. Employee
 2. Record
 3. ScheduleEntry
  

и сохраните все детали по частям в этих таблицах. Эта опция действительно единственная, которая позволяет вам эффективно работать с данными с помощью SQL.

Значительно худшим вариантом является наличие одной таблицы со столбцами для каждого ожидаемого бита

EmployeeNumber, RecordID, timeInMondayAM, timeOutMondayAM,timeInMondayPM, timeOutMondayPM, ... timeInAMSunday.. etc .

Другой вариант, который я, конечно, не рекомендовал бы, — это иметь столбец расписания с текстом, JSON или XML для вашего массива значений и сохранять их там в соответствующем формате.