我有一个包含以下代码的类
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);
}
}
}
然而,日期时间?强制转换无法使用' Invalid Cast'。 我检查了SQL数据库,该字段存储了有效日期 所以我无法解决为什么,当我通过DataReader将信息提取到我的应用程序时,datetime字段导致无效的转换。
请帮忙。
答案 0 :(得分:8)
您将要更改以下行:
this._doa = (DateTime?)caseReader["DOA"];
为:
if (caseReader["DOA"] != DBNull.Value)
this._doa.Value = (DateTime)caseReader["DOA"];
以及所有类似的行。
无法从Nullable类型中转换DBNull值。
答案 1 :(得分:4)
您的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 :(得分:2)
你应该使用
这不会抛出异常,比如
var mydate =(DateTime)datetimeString
或 var mydate = DateTime.Parse(datetimeString)
确实!!!
答案 3 :(得分:0)
尝试使用以下代码部分
this._doa = (caseReader["DOA"] == DBNull.Value ? DBNull.Value : Convert.ToDateTime(caseReader["DOA"]);
答案 4 :(得分:0)
尝试将日期时间转换为
this._doa = Convert.ToDateTime(caseReader["DOA"]);
答案 5 :(得分:0)
我经常处理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)