有没有更好的/更干净的方法来做到这一点? int stockvalue = 0; if (!Convert.IsDBNull(reader["StockValue"])) stockvalue = (int)reader["StockValue"];
我有一个DateTime? 我试图插入到使用DbParameter字段。 我正在创build这样的参数: DbParameter datePrm = updateStmt.CreateParameter(); datePrm.ParameterName = "@change_date"; 然后我想把DateTime?的值DateTime? 进入dataPrm.Value同时占null 。 我以为我会很聪明: datePrm.Value = nullableDate ?? DBNull.Value; 但失败的错误 运营商“??” 不能应用于“System.DateTime?”types的操作数 和“System.DBNull” 所以我猜想,只有第二个参数是第一个参数的非空值版本才有效。 那么我去了: datePrm.Value = nullableDate.HasValue ? nullableDate.Value : DBNull.Value; 但是这也不起作用: 条件expression式的types不能确定,因为没有“System.DateTime”和“System.DBNull”之间的隐式转换 但我不想在这些types之间转换! 到目前为止,我唯一可以工作的是: if (nullableDate.HasValue) datePrm.Value = nullableDate.Value; else datePrm.Value = DBNull.Value; 那真的是我写这个的唯一方法吗? 有没有办法使用三元运算符来实现单线程工作? 更新:我真的不明白为什么? 版本不起作用。 MSDN说: ?? 如果操作数不为null,则返回左操作数,否则返回右操作数。 这正是我想要的! Update2:最后这是很明显的: datePrm.Value […]
我想避免在我的代码中有如下的许多检查: myObj.someStringField = rdr.IsDBNull(someOrdinal) ? string.Empty : rdr.GetString(someOrdinal); 我想我可以通过做这样的事情来让我的查询照顾空值: SELECT myField1, [isnull](myField1, '') FROM myTable1 WHERE myField1 = someCondition 我使用SQLite,但似乎并没有认识到isnull函数。 我也尝试了一些在其他数据库( NVL() , IFNULL()和COALESCE() )中识别的等价类,但是SQLite似乎没有认出它们中的任何一个。 有没有人有任何build议或知道更好的方法来做到这一点。 不幸的是,数据库没有所有字段的默认值。 另外,在某些情况下,我需要使用一些LEFT JOIN子句,其中一些返回的字段将为空,因为LEFT JOIN表中的匹配logging将不存在。
下面的代码将不能编译: string foo = "bar"; Object o = foo == null ? DBNull.Value : foo; 我得到: 错误1条件expression式的types无法确定,因为没有“System.DBNull”和“string”之间的隐式转换 要解决这个问题,我必须做这样的事情: string foo = "bar"; Object o = foo == null ? DBNull.Value : (Object)foo; 这个演员似乎毫无意义,因为这当然是合法的: string foo = "bar"; Object o = foo == null ? "gork" : foo; 在我看来,当三元分支是不同types的时候,编译器不会自动把值赋给types对象…但是当它们是同一types时,自动装箱是自动的。 在我看来,第一个陈述应该是合法的… 任何人都可以描述为什么编译器不允许这样做,为什么C#的devise者select这样做? 我相信这是合法的Java …虽然我没有证实这一点。 谢谢。 编辑:我要求了解为什么Java和C#处理这个不同的是,在C#中,这使得这个无效的场景下发生了什么。 我知道如何使用三元组,而不是寻找“更好的方法”来编写例子。 […]
我想生成一些从MS-Access数据库检索到的数据的格式化输出,并存储在DataTable对象/variablesmyDataTable中。 但是,myDataTable中的一些字段包含dbNull数据。 因此,如果任何字段的姓氏 , intials或sID的值为dbNull ,则以下VB.net代码段将出现错误。 dim myDataTable as DataTable dim tmpStr as String dim sID as Integer = 1 … myDataTable = myTableAdapter.GetData() ' Reads the data from MS-Access table … For Each myItem As DataRow In myDataTable.Rows tmpStr = nameItem("lastname") + " " + nameItem("initials") If myItem("sID")=sID Then ' Do something End If […]
下面的代码给出了一个错误 – “没有从DBnull到int的隐式转换”。 SqlParameter[] parameters = new SqlParameter[1]; SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int); planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex; parameters[0] = planIndexParameter;
这个问题偶尔会出现,但我还没有看到满意的答案。 一个典型的模式是(行是一个DataRow ): if (row["value"] != DBNull.Value) { someObject.Member = row["value"]; } 我的第一个问题是哪个更有效率(我翻转了这个条件): row["value"] == DBNull.Value; // Or row["value"] is DBNull; // Or row["value"].GetType() == typeof(DBNull) // Or… any suggestions? 这表明.GetType()应该更快,但编译器可能知道一些我不知道的技巧? 第二个问题,值得cachingrow [“value”]的值还是编译器优化索引器呢? 例如: object valueHolder; if (DBNull.Value == (valueHolder = row["value"])) {} 笔记: 行[“值”]存在。 我不知道列的列索引(因此列名称查找)。 我特别要求检查DBNull,然后分配(不是过早优化等)。 我基准了几个场景(时间以秒为单位,10,000,000次试验): row["value"] == DBNull.Value: 00:00:01.5478995 row["value"] is DBNull: […]
在.NET中有空引用,它被用在任何地方都表示一个对象引用是空的,然后是DBNull ,它被数据库驱动程序(和其他几个)用来表示…几乎相同的东西。 当然,这造成了很多混乱,转换程序必须被搅动等等。 那么为什么最初的.NET作者决定做这个? 对我来说没有意义。 他们的文档也没有意义: DBNull类表示一个不存在的值。 例如,在一个数据库中,一行表中的一列可能不包含任何数据。 也就是说,列被认为根本不存在,而不仅仅是没有价值。 DBNull对象表示不存在的列。 此外,COM互操作使用DBNull类来区分指示不存在的值的VT_NULL变体和指示未指定值的VT_EMPTY变体。 关于“不存在专栏”的这个废话是什么? 列存在,它只是没有一个特定的行的值。 如果它不存在,我会得到一个exception,试图访问特定的单元格,而不是DBNull ! 我可以理解需要区分VT_NULL和VT_EMPTY ,但是为什么不COMEmpty类呢? 这将是整个.NET框架中的一个更好的select。 我错过了什么吗? 任何人都可以解释一下为什么DBNull是被发明的,它有什么问题可以帮助解决?
null和System.DBNull.Value之间是否有区别? 如果是,那是什么? 我现在注意到了这种行为 – while (rdr.Read()) { if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value) { int x = Convert.ToInt32(rdr["Id"]); } } 尽pipe我使用sql datareader从数据库中检索数据,但是if(rdr["Id"] != null)返回true并且最终抛出了一个用于将null转换为整数的exception,则没有返回值。 但是,如果我使用if (rdr["Id"] != System.DBNull.Value)返回false 。 null和System.DBNull.Value有什么区别?