Получение «преобразования типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона», даже если столбец datetime отсутствует - PullRequest
1 голос
/ 11 февраля 2020

У меня есть процедура в моей SQL серверной базе данных, которая возвращает некоторые даты в наборе записей, столбец, в котором я получаю даты, имеет тип данных varchar. Я использую LINQ2 SQL для выполнения процедуры.

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

преобразование Тип данных varchar с типом данных datetime привел к ошибке вне диапазона

. Я также проверил, что класс, который был сгенерирован компоновщиком классов LINQ2 SQL для набора записей этой процедуры, также не содержит никакого свойства, имеющего тип данных datetime.

Процедура слишком длинная для совместного использования, но я делюсь последним SELECT процедуры, который обнаружен конструктором класса LINQ2 SQL для генерации класса. Вот оно

DECLARE @finalResultSetTempTable AS TABLE ( 
                                              cd_id               BIGINT NOT NULL , 
                                              service_id          INT NULL , 
                                              resident_id         VARCHAR(20) , 
                                              cd_Date             VARCHAR(20) , 
                                              cd_StartTime        VARCHAR(20) , 
                                              cd_EndTime          VARCHAR(20) , 
                                              Pre_travelTime      VARCHAR(20) , 
                                              Post_travelTime     VARCHAR(20) , 
                                              cd_TimeDuration     VARCHAR(20) , 
                                              UnitType            INT , 
                                              NoOfUnits           INT , 
                                              cd_IsCompleted      BIT , 
                                              AssignedTo          INT , 
                                              cd_status           VARCHAR(50) , 
                                              Service_name        VARCHAR(200) , 
                                              Application_Name    VARCHAR(50) , 
                                              emp_first_name      VARCHAR(200) , 
                                              emp_last_name       VARCHAR(200) , 
                                              resident_first_name VARCHAR(200) , 
                                              resident_last_name  VARCHAR(200) , 
                                              address             VARCHAR(200) , 
                                              suburb              VARCHAR(200) , 
                                              state               VARCHAR(200) , 
                                              postCode            VARCHAR(200)
                                              );

SELECT cd_id , service_id , resident_id , FORMAT(CAST(cd_Date AS DATETIME) , 'yyyy-MM-dd') AS cd_Date , ISNULL(cd_StartTime , '12:00 AM') AS cd_StartTime , ISNULL(cd_EndTime , '12:00 AM') AS cd_EndTime , Pre_travelTime , Post_travelTime , ISNULL(cd_TimeDuration , '0') AS cd_TimeDuration , UnitType , NoOfUnits , cd_IsCompleted , AssignedTo , cd_status , Service_name , emp_first_name , emp_last_name , resident_first_name , resident_last_name , address , suburb , state , postCode , Application_Name
            FROM @finalResultSetTempTable

Класс, сгенерированный LINQ2 SQL, выглядит следующим образом

public partial class sp_GetServicesForBulkUpdateResult
{

    private long _cd_id;

    private System.Nullable<int> _service_id;

    private string _resident_id;

    private string _cd_Date;

    private string _cd_StartTime;

    private string _cd_EndTime;

    private string _Pre_travelTime;

    private string _Post_travelTime;

    private string _cd_TimeDuration;

    private System.Nullable<int> _UnitType;

    private System.Nullable<int> _NoOfUnits;

    private System.Nullable<bool> _cd_IsCompleted;

    private System.Nullable<int> _AssignedTo;

    private string _cd_status;

    private string _Service_name;

    private string _emp_first_name;

    private string _emp_last_name;

    private string _resident_first_name;

    private string _resident_last_name;

    private string _address;

    private string _suburb;

    private string _state;

    private string _postCode;

    private string _Application_Name;

    public sp_GetServicesForBulkUpdateResult()
    {
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_cd_id", DbType="BigInt NOT NULL")]
    public long cd_id
    {
        get
        {
            return this._cd_id;
        }
        set
        {
            if ((this._cd_id != value))
            {
                this._cd_id = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_service_id", DbType="Int")]
    public System.Nullable<int> service_id
    {
        get
        {
            return this._service_id;
        }
        set
        {
            if ((this._service_id != value))
            {
                this._service_id = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_resident_id", DbType="VarChar(20)")]
    public string resident_id
    {
        get
        {
            return this._resident_id;
        }
        set
        {
            if ((this._resident_id != value))
            {
                this._resident_id = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_cd_Date", DbType="NVarChar(4000)")]
    public string cd_Date
    {
        get
        {
            return this._cd_Date;
        }
        set
        {
            if ((this._cd_Date != value))
            {
                this._cd_Date = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_cd_StartTime", DbType="VarChar(20) NOT NULL", CanBeNull=false)]
    public string cd_StartTime
    {
        get
        {
            return this._cd_StartTime;
        }
        set
        {
            if ((this._cd_StartTime != value))
            {
                this._cd_StartTime = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_cd_EndTime", DbType="VarChar(20) NOT NULL", CanBeNull=false)]
    public string cd_EndTime
    {
        get
        {
            return this._cd_EndTime;
        }
        set
        {
            if ((this._cd_EndTime != value))
            {
                this._cd_EndTime = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Pre_travelTime", DbType="VarChar(20)")]
    public string Pre_travelTime
    {
        get
        {
            return this._Pre_travelTime;
        }
        set
        {
            if ((this._Pre_travelTime != value))
            {
                this._Pre_travelTime = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Post_travelTime", DbType="VarChar(20)")]
    public string Post_travelTime
    {
        get
        {
            return this._Post_travelTime;
        }
        set
        {
            if ((this._Post_travelTime != value))
            {
                this._Post_travelTime = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_cd_TimeDuration", DbType="VarChar(20) NOT NULL", CanBeNull=false)]
    public string cd_TimeDuration
    {
        get
        {
            return this._cd_TimeDuration;
        }
        set
        {
            if ((this._cd_TimeDuration != value))
            {
                this._cd_TimeDuration = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_UnitType", DbType="Int")]
    public System.Nullable<int> UnitType
    {
        get
        {
            return this._UnitType;
        }
        set
        {
            if ((this._UnitType != value))
            {
                this._UnitType = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_NoOfUnits", DbType="Int")]
    public System.Nullable<int> NoOfUnits
    {
        get
        {
            return this._NoOfUnits;
        }
        set
        {
            if ((this._NoOfUnits != value))
            {
                this._NoOfUnits = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_cd_IsCompleted", DbType="Bit")]
    public System.Nullable<bool> cd_IsCompleted
    {
        get
        {
            return this._cd_IsCompleted;
        }
        set
        {
            if ((this._cd_IsCompleted != value))
            {
                this._cd_IsCompleted = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_AssignedTo", DbType="Int")]
    public System.Nullable<int> AssignedTo
    {
        get
        {
            return this._AssignedTo;
        }
        set
        {
            if ((this._AssignedTo != value))
            {
                this._AssignedTo = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_cd_status", DbType="VarChar(50)")]
    public string cd_status
    {
        get
        {
            return this._cd_status;
        }
        set
        {
            if ((this._cd_status != value))
            {
                this._cd_status = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Service_name", DbType="VarChar(200)")]
    public string Service_name
    {
        get
        {
            return this._Service_name;
        }
        set
        {
            if ((this._Service_name != value))
            {
                this._Service_name = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_emp_first_name", DbType="VarChar(200)")]
    public string emp_first_name
    {
        get
        {
            return this._emp_first_name;
        }
        set
        {
            if ((this._emp_first_name != value))
            {
                this._emp_first_name = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_emp_last_name", DbType="VarChar(200)")]
    public string emp_last_name
    {
        get
        {
            return this._emp_last_name;
        }
        set
        {
            if ((this._emp_last_name != value))
            {
                this._emp_last_name = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_resident_first_name", DbType="VarChar(200)")]
    public string resident_first_name
    {
        get
        {
            return this._resident_first_name;
        }
        set
        {
            if ((this._resident_first_name != value))
            {
                this._resident_first_name = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_resident_last_name", DbType="VarChar(200)")]
    public string resident_last_name
    {
        get
        {
            return this._resident_last_name;
        }
        set
        {
            if ((this._resident_last_name != value))
            {
                this._resident_last_name = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_address", DbType="VarChar(200)")]
    public string address
    {
        get
        {
            return this._address;
        }
        set
        {
            if ((this._address != value))
            {
                this._address = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_suburb", DbType="VarChar(200)")]
    public string suburb
    {
        get
        {
            return this._suburb;
        }
        set
        {
            if ((this._suburb != value))
            {
                this._suburb = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_state", DbType="VarChar(200)")]
    public string state
    {
        get
        {
            return this._state;
        }
        set
        {
            if ((this._state != value))
            {
                this._state = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_postCode", DbType="VarChar(200)")]
    public string postCode
    {
        get
        {
            return this._postCode;
        }
        set
        {
            if ((this._postCode != value))
            {
                this._postCode = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Application_Name", DbType="VarChar(50)")]
    public string Application_Name
    {
        get
        {
            return this._Application_Name;
        }
        set
        {
            if ((this._Application_Name != value))
            {
                this._Application_Name = value;
            }
        }
    }
}

Код, который я написал для выполнения процедуры, показан ниже

Service service;
                res = new List<Service>();
                var resultSet = context.sp_GetServicesForBulkUpdate(assignedTo, _fromDate, _toDate, programName, serviceID.ToString(), "ALL");

                foreach (var item in resultSet)
                {
                    service = new Service();
                    service.serviceDeliveryID = item.cd_id.ToString();
                    service.serviceID = item.service_id.ToString();
                    service.serviceStatus = item.cd_status;
                    service.serviceName = item.Service_name;
                    service.serviceStartDate = string.IsNullOrEmpty(item.cd_Date) ? "" : item.cd_Date;
                    service.serviceStartTime = item.cd_StartTime;
                    service.serviceEndDate = string.IsNullOrEmpty(item.cd_Date) ? "" : item.cd_Date;
                    service.serviceEndTime = item.cd_EndTime;
                    service.serviceLocation = ((string.IsNullOrEmpty(item.address) ? "" : item.address + ", ") + (string.IsNullOrEmpty(item.suburb) ? "" : item.suburb + ", ") + (string.IsNullOrEmpty(item.state) ? "" : item.state + ", ") + (string.IsNullOrEmpty(item.postCode) ? "" : item.postCode + " ")).Trim().TrimEnd(',');

                    service.serviceUnitType = item.UnitType;
                    service.serviceNoOfUnits = item.NoOfUnits;

                    service.employeeID = Int32.Parse((item.AssignedTo.HasValue ? item.AssignedTo.ToString() : "0"));
                    service.employeeFirstName = string.IsNullOrEmpty(item.emp_first_name) ? "" : item.emp_first_name;
                    service.employeeLastName = string.IsNullOrEmpty(item.emp_last_name) ? "" : item.emp_last_name;

                    service.residentID = item.resident_id;
                    service.residentFirstName = item.resident_first_name;
                    service.residentLastName = item.resident_last_name;

                    service.isAssigned = (item.AssignedTo.HasValue && item.AssignedTo != 0) ? true : false;

                    service.isActive = item.cd_IsCompleted.ToString() == "0" ? false : true;
                    service.serviceAppName = item.Application_Name;


                    res.Add(service);
                }

Вот некоторые примеры данных, возвращаемых процедурой, если они могут быть полезны

Sample Data Returned by the Procedure

Может ли кто-нибудь оказать какую-либо помощь?

РЕДАКТИРОВАТЬ

Формат даты на прикрепленном снимке экрана m/dd/yyyy из-за листа Excel. Фактический формат yyyy-mm-dd

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

После изучения процедуры я обнаружил, что FORMAT(CAST(cd_Date AS DATETIME) , 'yyyy-MM-dd') AS cd_Date создает проблему. Поскольку мои данные уже были в этом формате, и когда CAST(cd_Date AS DATETIME) пытается преобразовать значение varchar в datetime, это выдает ошибку.

По моему мнению, CAST(cd_Date AS DATETIME) ожидает varchar дату в формате yyyy-dd-MM, поскольку у пользователя, которого я использую для запроса к базе данных, установлен язык Briti sh (я получил эту подсказку от этот вопрос ), поэтому при преобразовании даты, например 2015-05-16 (в формате yyyy-MM-dd), выдается ошибка

при преобразовании типа данных varchar в данные datetime тип привел к значению вне допустимого диапазона

Пожалуйста, исправьте меня, если я ошибаюсь, или добавьте что-нибудь, если отсутствует.

0 голосов
/ 11 февраля 2020
DECLARE @finalResultSetTempTable AS TABLE ( 
                                              cd_id               BIGINT NOT NULL , 
                                              service_id          INT NULL , 
                                              resident_id         VARCHAR(20) , 
                                              cd_Date             VARCHAR(20) , 
                                              cd_StartTime        VARCHAR(20) , 
                                              cd_EndTime          VARCHAR(20) , 
                                              Pre_travelTime      VARCHAR(20) , 
                                              Post_travelTime     VARCHAR(20) , 
                                              cd_TimeDuration     VARCHAR(20) , 
                                              UnitType            INT , 
                                              NoOfUnits           INT , 
                                              cd_IsCompleted      BIT , 
                                              AssignedTo          INT , 
                                              cd_status           VARCHAR(50) , 
                                              Service_name        VARCHAR(200) , 
                                              Application_Name    VARCHAR(50) , 
                                              emp_first_name      VARCHAR(200) , 
                                              emp_last_name       VARCHAR(200) , 
                                              resident_first_name VARCHAR(200) , 
                                              resident_last_name  VARCHAR(200) , 
                                              address             VARCHAR(200) , 
                                              suburb              VARCHAR(200) , 
                                              state               VARCHAR(200) , 
                                              postCode            VARCHAR(200)
                                              );

SELECT cd_id , service_id , resident_id ,  CONVERT(datetime,cd_Date,103) AS cd_Date , ISNULL(cd_StartTime , '12:00 AM') AS cd_StartTime , ISNULL(cd_EndTime , '12:00 AM') AS cd_EndTime , Pre_travelTime , Post_travelTime , ISNULL(cd_TimeDuration , '0') AS cd_TimeDuration , UnitType , NoOfUnits , cd_IsCompleted , AssignedTo , cd_status , Service_name , emp_first_name , emp_last_name , resident_first_name , resident_last_name , address , suburb , state , postCode , Application_Name
            FROM @finalResultSetTempTable
...