Как сопоставить результат запроса с классом, а затем со списком, который затем будет использоваться для заполнения списка? не может передать результат запроса в класс - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь заполнить представление списка, поэтому я начинаю с сопоставления результата запроса с моделью класса, но он продолжает выдавать мне это исключение »System.Data.DataException Message = Ошибка синтаксического анализа столбца 0 (TimeOfAppointment = 15:30 : 00 - Object) Source = Dapper InvalidCastException: объект должен реализовывать IConvertible. "

мой класс

public class AppointmentModel
    {
        public string PatientName { get; set; }
        public int AppointmentId { get; set; }
        public DateTime Date { get; set; }
        public DateTime TimeOfAppointment { get; set; }
        public int Duration { get; set; }
    }

мой запрос

CREATE PROCEDURE [dbo].[spGet_Appointments_byDay]
    @DateSelected date
AS
begin
select [dbo].[Appointments].[TimeOfAppointment], [dbo].[Appointments].[Duration], [dbo].[Patients].[Name], [dbo].[Appointments].[Date], dbo.Appointments.AppointmentId
from [dbo].[Appointments]
inner join [dbo].[Patients] on [dbo].[Appointments].PatientId = [dbo].[Patients].PatientID
where [dbo].[Appointments].[Date] = @DateSelected;
end

вот как я назовите его

public List<AppointmentModel> CreateListViewList(DateTime date)
        {
            List<AppointmentModel> ListForListView;
            var l = new DynamicParameters();
            l.Add("@DateSelected", date);
            using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(GlobalConfig.CnnString(db)))
            {
                ListForListView = connection.Query<AppointmentModel>("[Test DB].dbo.spGet_Appointments_byDay", l, commandType: CommandType.StoredProcedure).ToList();
            }

            return ListForListView;
        }

, и он заполняет поле списка

private void button1_Click_1(object sender, EventArgs e)
        {
            foreach (IDataConnection db in GlobalConfig.Connections)
            {
                ListForListView.AddRange(db.CreateListViewList(AppointmentDateBox.Value.Date));
            }
            
            foreach (AppointmentModel RowFromQuery in ListForListView)
            {
                ListViewItem viewItem = new ListViewItem(RowFromQuery.TimeOfAppointment.ToString());
                viewItem.SubItems.Add(RowFromQuery.Duration.ToString());
                viewItem.SubItems.Add(RowFromQuery.PatientName);
                viewItem.SubItems.Add(RowFromQuery.AppointmentId.ToString());

                listView1.Items.Add(viewItem);

            }
        }

мои таблицы

CREATE TABLE [dbo].[Appointments]
(
    [AppointmentId] INT NOT NULL PRIMARY KEY IDENTITY, 
    [PatientId] INT NOT NULL, 
    [Date] DATE NOT NULL, 
    [Duration] INT NOT NULL, 
    [TimeOfAppointment] TIME NOT NULL, 
)
CREATE TABLE [dbo].[Patients]
(
    [PatientID] INT NOT NULL PRIMARY KEY IDENTITY, 
    [Name] VARCHAR(50) NOT NULL, 
)

Я действительно новичок в этом, так что Я делаю не так?

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Используйте приведенный ниже код для решения проблемы.

using (var connection = new SqlConnection(GlobalConfig.CnnString(db)))
{
    DynamicParameters parameter = new DynamicParameters();
    parameter.Add("@DateSelected", date, DbType.Time, ParameterDirection.Input);

    CommandDefinition cmd = new CommandDefinition("[Test DB].dbo.spGet_Appointments_byDay", parameter, null, null, CommandType.StoredProcedure);
    lstLookuptypes = connection.QueryFirstOrDefault<List<AppointmentModel>>(cmd).ToList();
}

Либо вам нужно изменить тип данных с TimeOfAppointment на TimeSpan, либо вам нужно изменить тип данных на SQL сервере . Ниже приведены сопоставления типов данных сервера SQL и среды CLR.

дата - DateTime, Nullable<DateTime> время - TimeSpan, Nullable<TimeSpan>

Ссылка: { ссылка }

1 голос
/ 01 августа 2020

попробуйте использовать TimeSpan в вашей модели для типа данных Time.

//public DateTime TimeOfAppointment { get; set; }

public TimeSpan TimeOfAppointment { get; set; }
...