- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我看到了this thread关于在 DBNull 和可空类型之间转换的 Stack Overflow,但我仍然感到困惑。我已经用一些 hack 代码编写了这样的代码来处理我将在下面显示的 DateTime 和 int 的可空类型,但它很乱,我想使用可空类型:
DataTable dt = ds.Tables[0];
List<RON> list = (from dr in dt.AsEnumerable()
select new RON
{
RONId = dr[0].ToString(),
StaffNumber = dr[1].ToString(),
CheckInDate = GetCheckInDate(dr[2]),
NonMissionIndicator = dr[3].ToString(),
Comments = dr[4].ToString(),
NonComplyIndicator = dr[5].ToString(),
LOAirport = dr[6].ToString(),
RONAirport = dr[7].ToString(),
PropertyId = GetPropertyId(dr[8]),
PropertyChain = dr[9].ToString(),
PropertyName = dr[10].ToString(),
PropertyStreet = dr[11].ToString(),
PropertyStreet2 = dr[12].ToString(),
PropertyCity = dr[13].ToString(),
PropertyState = dr[14].ToString(),
PropertyPostalCode = dr[15].ToString(),
PropertyPhone = dr[16].ToString(),
FAX = dr[17].ToString(),
PropertyCountry = dr[18].ToString(),
PropertyLongitude = GetPropertyLongitude(dr[19]),
PropertyLatitude = GetPropertyLatitude(dr[20]),
PropertyAirport = dr[21].ToString(),
ReportedBy = dr[22].ToString(),
ReportedDTS= GetReportedByDate(dr[23]),
CanceledBy = dr[24].ToString(),
CanceledDTS = GetCanceledByDate(dr[25])
}).ToList();
return list;
}
//TODO: Change Defaukt date
private static DateTime GetCheckInDate(object checkInDate)
{
return checkInDate == DBNull.Value ? new DateTime(2000, 1, 1, 00, 00, 00) : Convert.ToDateTime(checkInDate);
}
//TODO: Change Defaukt date
private static DateTime GetReportedByDate(object reportedByDate)
{
return reportedByDate == DBNull.Value ? new DateTime(2000, 1, 1, 00, 00, 00) : Convert.ToDateTime(reportedByDate);
}
//TODO: Change Defaukt date
private static DateTime GetCanceledByDate(object canceledByDate)
{
return canceledByDate == DBNull.Value ? new DateTime(2000, 1, 1, 00, 00, 00) : Convert.ToDateTime(canceledByDate);
}
private static Int32 GetPropertyId(object propertyId)
{
return propertyId == DBNull.Value ? 0 : Convert.ToInt32(propertyId);
}
private static double GetPropertyLongitude(object propertyLongitude)
{
return propertyLongitude == DBNull.Value ? 0.0 : Convert.ToDouble(propertyLongitude);
}
private static double GetPropertyLatitude(object propertyLatitude)
{
return propertyLatitude == DBNull.Value ? 0.0 : Convert.ToDouble(propertyLatitude);
}
RON 现在定义为:
public class RON
{
public string RONId { get; set; }
public string StaffNumber { get; set; }
public DateTime CheckInDate { get; set; }
public string NonMissionIndicator { get; set; }
public string NonComplyIndicator { get; set; }
public string LOAirport { get; set; }
public string RONAirport { get; set; }
public int PropertyId { get; set; }
public string PropertyChain { get; set; }
public string PropertyName { get; set; }
public string PropertyStreet { get; set; }
public string PropertyStreet2 { get; set; }
public string PropertyCity { get; set; }
public string PropertyState { get; set; }
public string PropertyPostalCode { get; set; }
public string PropertyCountry { get; set; }
public string PropertyPhone { get; set; }
public string FAX { get; set; }
public double PropertyLongitude { get; set; }
public double PropertyLatitude { get; set; }
public string PropertyAirport { get; set; }
public string ReportedBy { get; set; }
public DateTime ReportedDTS { get; set; }
public string CanceledBy { get; set; }
public DateTime CanceledDTS { get; set; }
public string Comments { get; set; }
数据库专家告诉我这是 Oracle 在 DataSet/cursor 中的返回:
RON_ID NOT NULL VARCHAR2(40)
STAFF_NUM NOT NULL VARCHAR2(12)
CHECKIN_DATE NOT NULL DATE
NONMISSION_IND NOT NULL VARCHAR2(1)
COMMENTS VARCHAR2(4000)
NONCOMPLY_IND VARCHAR2(4000)
PROPERTY_ID NOT NULL NUMBER(38)
PROPERTY_CHAIN VARCHAR2(2)
PROPERTY_NAME VARCHAR2(255)
RON_AIRPORT NOT NULL VARCHAR2(3)
PROPERTY_STREET VARCHAR2(255)
PROPERTY_STREET2 VARCHAR2(255)
PROPERTY_CITY VARCHAR2(255)
PROPERTY_STATE VARCHAR2(3)
PROPERTY_POSTALCODE VARCHAR2(255)
PROPERTY_PHONE VARCHAR2(20)
PROPERTY_FAX VARCHAR2(20)
PROPERTY_COUNTRY VARCHAR2(2)
PROPERTY_LONGITUDE NUMBER
PROPERTY_LATITUDE NUMBER
PROPERTY_AIRPORT VARCHAR2(3)
REPORTED_BY VARCHAR2(50)
REPORTED_DTS NOT NULL DATE
CANCELED_BY VARCHAR2(50)
CANCELED_DTS DATE
如何使用可空类型声明 RON 以及如何使用可空日期等进行操作?是否必须检查字符串?
最佳答案
要将值类型(例如 DateTime)定义为 Nullable...请执行以下操作之一:
DateTime? ReportedDTS
或
Nullable<DateTime> ReportedDTS
引用类型(例如字符串)已经是“可空的”。
要从 DataRow 中获取可为 null 的值,您可以使用字段扩展方法:
DateTime? nullableDate = dataRow.Field<DateTime?>("ColumnName");
这会自动将 DBNull 转换为 null。
因此对于您的示例,您可以执行以下操作:
select new RON
{
RONId = dr.Field<string>("RON_ID"),
// snip...
CheckInDate = dr.Field<DateTime?>("CHECKIN_DATE"),
// snip...
};
关于c# - 可空类型、DBNulls 和数据行的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4047171/
我的应用程序输出“System.InvalidCastException:“对象无法从 DBNull 转换为其他类型。” Dim sqlquery = String.Format("SELECT id
是否有人对如何检查值是否为 DBNull 有偏好? ?我发现这两个语句给了我想要的结果,但只是想知道是否有偏好? if (any is System.DBNull) 与...一样: if (any =
我很好奇使用 if(some_value is DBNull) 与 if(DBNull.Value.Equals(some_value)) 的优缺点是什么。我个人更喜欢 if(some_value i
我可以检查 DBnull使用任何方法在数据行上。 要么通过使用 if(dr[0][0]==DBNull.Value) //do somethin 或者通过做 if(dr[0][0].ToString(
如标题所示,我有一个代码,当数据库中没有几何图形并且 DbGeometry 获得空值时,我会收到带有空值的 DbNull 类型。但是当我想做一个 if 语句来检查 DbGeometry 是否等于 Db
我对 .NET 中的空值和变量有点困惑。 (首选VB) 有没有办法检查任何给定变量的“空值”,无论它是对象还是值类型?或者我的空检查是否必须始终预测它是检查值类型(例如 System.Integer)
编辑:从PowerShell 7 Preview 2开始,由于Joel Sallow通过pull request 9794,-not [System.DBNull]::Value的计算结果为$true
在 .NET 中有 null引用,到处都用来表示一个对象引用为空,然后还有DBNull ,它被数据库驱动程序(和其他几个)用来表示......几乎相同的东西。自然,这会造成很多困惑,并且必须制定转换例
SQLServer 整型字段。值有时为空。DataAdapter填充数据集OK,可以在DatagridView中显示数据。 当尝试以编程方式从数据集中检索数据时,数据集字段检索代码会抛出 Strong
现在我正在使用以下方法: string[] AudienceTags = ((string[])(relResults["NEVCOAudienceTag"].GetType() == typeof(
我有一个类型为的对象: dynamic {System.DBNull} 我要检查一下: if (myObject!= null || myObject!= DBNull.Value) { Mes
当使用 expando 对象填充我的数据表时,我在初始化新的 datarow 时遇到以下错误消息。异常(exception)情况是: Invalid Storage Type: DBNull publ
我得到 从类型 'DBNull' 到类型 'Integer' 的转换无效。”错误行“Dim avgObject As string = Cstr(avgCom.ExecuteScalar()) 当删除
当我从数据库中检索任何标量值时,我通常会为可为空的字段编写这样的代码。 cmd.ExecuteScalar() == DBNull.Value ? 0 : (int)cmd.ExecuteScalar
我需要从一个DataRow 中解析一个值并将其分配给另一个DataRow。如果输入有效,则我需要将其解析为 double,或者将 DBNull 值添加到输出。我正在使用以下代码: public dou
我正在尝试执行一个存储过程,然后使用 if 语句检查空值,但我做空了。我是 VB 专家,所以如果我犯了小学生语法错误,请多多包涵。 objConn = new SqlConnection(strCon
如果 DataRow 中的列可能是 DBNull , 是以下将 DBNull 替换为空字符串的最短方法? Dim result As String = if(isDBNull(dataRow1("co
我正在查看我正在处理的 .net 程序的一些代码。该程序的前任作者在一年前将代码给了我。突然,我看到一个我没有接触过的代码抛出的异常: if ((string)row["LevelName"] !=
当用户名与登录我的程序的用户相同时,我编写了从 Access 数据库中检索电子邮件地址的代码。我希望在名为 Email 的文本框中显示电子邮件地址值 Dim x If ConnectionDb.Sta
这个问题偶尔会出现,但我还没有看到令人满意的答案。 典型的模式是(行是DataRow): if (row["value"] != DBNull.Value) { someObject.
我是一名优秀的程序员,十分优秀!