Как установить логическое значение для столбца, который можно использовать в моем веб-приложении MVC? - PullRequest
0 голосов
/ 20 февраля 2019

В моем веб-приложении MVC у меня есть класс модели, который взаимодействует с представлением базы данных SQL, которое хранится в моей базе данных SQL Azure.Модель выглядит следующим образом:

namespace GanttTest.Models
{
    [Table("GanttTest")]
    public class Task
    {
        public int Id { get; set; }
        public string Text { get; set; }
        public DateTime? StartDate { get; set; }
        public int? Duration { get; set; }        
        public DateTime? EndDate { get; set; }
        public DateTime? OptionsEnd { get; set; }
        public DateTime? OptionsStart { get; set; }
        public bool Unscheduled { get; set; }
    }
}

В верхней части модели указана таблица, представляющая собой представление SQL, которое я создал.

Поскольку эта модель обслуживает диаграмму Ганта, у меня естьМесто для данных:

namespace GanttTest.Models
{
    public class TaskDto
    {
        public int id { get; set; }
        public string text { get; set; }
        public string start_date { get; set; }
        public int? duration { get; set; }
        public decimal progress { get; set; }
        public int? parent { get; set; }
        public string options_start { get; set; }
        public string options_end { get; set; }
        public string type { get; set; }
        public bool unscheduled { get; set;}
        public bool open
        {
            get { return true; }
            set { }
        }

        public static explicit operator TaskDto(Task task)
        {
            return new TaskDto
            {
                id = task.Id,
                text = task.Text,
                start_date = task.StartDate?.ToString("yyyy-MM-dd HH:mm") ?? "",
                options_start = task.OptionsStart?.ToString("yyyy-MM-dd HH:mm") ?? "", /*Allows toString to be used on nullable types*/
                options_end = task.OptionsEnd?.ToString("yyyy-MM-dd HH:mm") ?? "",
                duration = task.Duration,
                unscheduled = task.Unscheduled
            };
        }

        public static explicit operator Task(TaskDto task)
        {
            return new Task
            {
                Id = task.id,
                Text = task.text,
                StartDate = DateTime.Parse(task.start_date, System.Globalization.CultureInfo.InvariantCulture),
                OptionsStart = DateTime.Parse(task.start_date, System.Globalization.CultureInfo.InvariantCulture),
                OptionsEnd = DateTime.Parse(task.start_date, System.Globalization.CultureInfo.InvariantCulture),
                Duration = task.duration,
                Unscheduled = task.unscheduled
            };
        }
    }
}

Метод сбора данных, который использует WebAPI, выглядит следующим образом:

 public IEnumerable<TaskDto> Get()
 {
     var task = db.Tasks.ToList().Select(t => (TaskDto)t);
     return task;
 }

Представление имеет CASE, определенное для установкиусловное значение столбца с именем Unscheduled, которое вы можете увидеть в модели выше.Это логическое значение, поэтому оно может быть истинным или ложным.

(CASE WHEN Onhire IS NULL THEN 1 ELSE 0 END) AS Unscheduled

Проблема, с которой я столкнулся, заключается в том, что при запуске приложения и сборе данных возникает ошибка:

System.InvalidOperationException: «Свойство« Не запланировано »в« Задаче »не может быть установлено в значение« System.Int32 ».Вы должны установить для этого свойства ненулевое значение типа System.Boolean.'

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

Есть ли способ определить логические значения, которые я не использую?Я немного смущен.Документация по теме показывает использование 0 и 1.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

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

CAST(CASE WHEN fix1.Onhire IS NULL THEN 1 ELSE 0 END AS bit) AS Unscheduled

Приложение понимает, что оно является битовым / логическим, а не просто числом / строкой или чем-то еще, что оно пытается взаимодействовать как.

0 голосов
/ 20 февраля 2019

Если вы используете объекты из пространства имен System.Data.SqlClient, логический тип данных C # соответствует битовому типу данных SQL Server.Например, в следующем примере для «BitColumn» установлено значение 1. Для объектов в пространстве имен System.Data.OleDb можно использовать тип данных OleDbType.Boolean, причем булев тип данных C # по-прежнему коррелирует с типом битов SQL Server.

    string cmdText = @"UPDATE DBO.TABLE SET BitColumn =  = @bVal";
    bool b = true;

    using (SqlConnection conn = new SqlConnection(connectionStr))
    {
        SqlCommand sql = new SqlCommand(cmdText, conn);

        SqlParameter boolParameter = new SqlParameter("@bVal", SqlDbType.Bit);
        boolParameter.Direction = ParameterDirection.Input;
        boolParameter.Value = b;
        sql.Parameters.Add(boolParameter);

        conn.Open();

        sql.ExecuteNonQuery();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...