我有一个数据库,其中包含用户的可选配置文件。在配置文件中,我有字符串,char(对于M或F)和整数。
我遇到了一个问题,我试图将用户的性别置于我的Profile对象的属性中,并且应用程序崩溃,因为它不知道如何处理返回的null值。
我已尝试将数据转换为适当的类型
char sex = (char)dt.Rows[0]["Sex"];
哪个不能解决我的问题。然后我尝试将类型更改为Nullable和Nullable,并获得完全相同的转换问题。我能够找到的当前解决方案如下:
object.sex = null;
if(dt.Rows[0]["Sex"] != DBNull.Value)
object.sex = (char)dt.Rows[0]["Sex"];
object.WorkExt = null;
if(dt.Rows[0]["WorkExt"] != DBNull.Value)
object.WorkExt = (int)dt.Rows[0]["WorkExt"];
有更简单或更好的方法吗?还是我几乎走在正确的轨道上?
答案 0 :(得分:3)
可空类型就是为此而设计的!用'作为char?'而不是'(char?)'
class Foo {
char? sex;
}
Foo object;
object.sex = dt.Rows[0]["Sex"] as char?;
答案 1 :(得分:3)
rotard的答案(使用Is<ColumnName>Null()
)仅适用于类型化数据集。
对于非类型化数据集,您必须使用以下代码中的一种模式。如果此代码不是确定的,请告诉我,我将对其进行编辑,直到它为止。这是一个非常普遍的问题,应该只有一个正确答案。
using System.
using System.Data;
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("test", typeof (char));
dt.Columns["test"].AllowDBNull = true;
DataRow dr = dt.Rows.Add();
char? test;
try
{
test = (char?)dr["test"];
}
catch (InvalidCastException)
{
Console.WriteLine("Simply casting to a nullable type doesn't work.");
}
test = dr.Field<char?>("test");
if (test == null)
{
Console.WriteLine("The Field extension method in .NET 3.5 converts System.DBNull to null.");
}
test = (dr["test"] is DBNull) ? null : (char?) dr["test"];
if (test == null)
{
Console.WriteLine("Before .NET 3.5, you have to check the type of the column's value.");
}
test = (dr["test"] == DBNull.Value) ? null : (char?) dr["test"];
if (test == null)
{
Console.WriteLine("Comparing the field's value to DBNull.Value is very marginally faster, but takes a bit more code.");
}
// now let's put the data back
try
{
dr["test"] = test;
}
catch (ArgumentException)
{
Console.WriteLine("You can't set nullable columns to null.");
}
dr.SetField("test", test);
if (dr["test"] is DBNull)
{
Console.WriteLine("Again, in .NET 3.5 extension methods make this relatively easy.");
}
dr["test"] = (object)test ?? DBNull.Value;
if (dr["test"] is DBNull)
{
Console.WriteLine("Before .NET 3.5, you can use the null coalescing operator, but note the awful cast required.");
}
Console.ReadLine();
}
}
答案 2 :(得分:2)
答案 3 :(得分:1)
是否是ADO.Net 2数据表?你能不能做这样的事情:
if(dt.Rows[0].IsSexNull()) {} else {}
?另外,假设您可以控制数据库,使用一点而不是字符串会更有意义吗?
答案 4 :(得分:1)
怎么样:
internal static T CastTo<T>(object value)
{
return value != DBNull.Value ? (T)value : default(T);
}
然后像:
一样使用它 return new EquipmentDetails(
CastTo<int>(reader["ID"]),
CastTo<int>(reader["CategoryID"]),
CastTo<string>(reader["Description"]));
等...
答案 5 :(得分:0)
我会像你那样做。我会为它写一个函数:
做的事情:
object.sex = handle(dt.Rows[0]["Sex"]);
在句柄中你执行== DBNull.Value检查。