Неверное приведение даты? - PullRequest
3 голосов
/ 29 марта 2012

У меня есть класс со следующим кодом

 public cCase(string pCaseNo, string pMode)
    {
        if (pMode == "new")
        {
            this._caseNo = Validate_CaseNo(pCaseNo);
        }
        if (pMode == "existing")
        {
            try
            {
                int intValidatedCaseNo = Validate_CaseNo(pCaseNo);
                string sqlText = "SELECT * FROM tblCases WHERE CaseNo = @CaseNo;";
                string strConnection = cConnectionString.BuildConnectionString();
                SqlConnection linkToDB = new SqlConnection(strConnection);
                linkToDB.Open();
                SqlCommand sqlCom = new SqlCommand(sqlText, linkToDB);
                sqlCom.Parameters.Add("@CaseNo", SqlDbType.Int);
                sqlCom.Parameters["@CaseNo"].Value = intValidatedCaseNo;
                SqlDataReader caseReader = sqlCom.ExecuteReader();
                if (caseReader.HasRows)
                    while (caseReader.Read())
                    {
                        this._claimant = caseReader["Claimant"].ToString();
                        this._defendant = caseReader["Defendant"].ToString();
                        this._caseType = caseReader["CaseType"].ToString();
                        this._occupation = caseReader["Occupation"].ToString();
                        this._doa = (DateTime?)caseReader["DOA"];
                        this._dateClosed = (DateTime?)caseReader["DateClosed"];
                        this._dateSettled = (DateTime?)caseReader["DateSettled"];
                        this._dateInstructed = (DateTime?)caseReader["DateInstructed"];
                        this._status = caseReader["Status"].ToString();
                        this._instructionType = caseReader["InstructionType"].ToString();
                        this._feeEstimate = (decimal?)caseReader["FeeEstimate"];
                        this._amountClaimed = (decimal?)caseReader["AmountClaimed"];
                        this._amountSettled = (decimal?)caseReader["AmountSettled"];
                        this._caseManager = caseReader["CaseManager"].ToString();
                    }
                caseReader.Close();
                linkToDB.Close();
                linkToDB.Dispose();
            }
            catch (Exception eX)
            {
                throw new Exception("Error finding case" + Environment.NewLine + eX.Message);
            }
        }
    }

Однако Datetime?броски не удаются с «Неверным броском».Я проверил базу данных SQL, и в поле хранятся действительные даты. Поэтому я не могу понять, почему при извлечении информации через DataReader в мое приложение поля даты и времени вызывают неверное приведение.

Пожалуйста, помогите.

Ответы [ 6 ]

9 голосов
/ 29 марта 2012

Вы захотите изменить строку, которая гласит:

this._doa = (DateTime?)caseReader["DOA"];

на:

if (caseReader["DOA"] != DBNull.Value)
    this._doa.Value = (DateTime)caseReader["DOA"];

, а также все подобные строки.

DBNullзначения не могут быть преобразованы из типов Nullable.

4 голосов
/ 29 марта 2012

Ваши поля DateTime, вероятно, содержат значение DBNull, которое вы не можете преобразовать напрямую.

Однако для удобства я бы использовал метод расширения на DataReader.

public static class DataReaderExtensions
{
  public static DateTime? ReadNullableDateTime(this IDataReader reader, string column)
    {
        return reader.IsDBNull(column) ? (DateTime?)null : reader.GetDateTime(column);
    }
}

// Использование

 this._dateInstructed = CaseReader.ReadNullableDateTime("DateInstructed");
2 голосов
/ 19 сентября 2014

Вы должны использовать

DateTime.TryParse Method

это не исключение, например

var mydate =(DateTime)datetimeString

var mydate = DateTime.Parse (datetimeString)

делает !!!

0 голосов
/ 29 марта 2012

Я часто имею дело с DBNull.Value ...

Поэтому я использую этот метод, который возвращает значение объекта или значение по умолчанию для данного типа значения, если значение объекта равно DBNull.Value.

    public static object GetValueOrDefault(object value, Type type)
    {
        if (value != DBNull.Value)
            return value;

        if (type.IsValueType == false)
            return null;

        Array array = Array.CreateInstance(type, 1);

        return array.GetValue(0);
    }

Использование:

GetValueOrDefault(dataRecord.GetValue(fieldIndex), dataRecord.GetFieldType(fieldIndex)
0 голосов
/ 29 марта 2012

Попробуйте конвертировать дату и время как

this._doa = Convert.ToDateTime(caseReader["DOA"]);
0 голосов
/ 29 марта 2012

Попробуйте использовать следующую часть кода

this._doa = (caseReader["DOA"] == DBNull.Value ? DBNull.Value : Convert.ToDateTime(caseReader["DOA"]); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...