DBNull投向(对象)返回不同的值
我正在尝试使用Parameters.AddWithVallue编写Parameters.AddWithVallue当C#方法的可选参数(a string)为null. public static void Abc(string distrito, string municipio = null) command.Parameters.AddWithValue("@Municipio", municipio ?? (object)DBNull.Value); command.Parameters.AddWithValue("@Municipio", municipio.Length > 0 ? municipio : (object)DBNull.Value); 但是,(object)DBNULL在两个不同的工作方式中返回两个不同的值.一个写为空/空和另一个null. 解决方案 我将做一些假设,但我想我知道发生了什么. municipio可能是一个空字符串.它是不是 n
2 2024-01-19
编程技术问答社区
SqlDataReader 检查空值的最佳方法 -sqlDataReader.IsDBNull vs DBNull.Value
我想从数据库中检索十进制值,我想知道哪种建议检查null值的推荐方法. 我已经在 msdn -dbnull.value field 很少使用此检查. 因此,reader.IsDBNull是检查nulls的最佳/最有效方法吗? 我创建了2种示例方法: public static decimal? GetNullableDecimal(SqlDataReader reader, string fieldName) { if (reader[fieldName] == DBNull.Value) { return null; } return (decimal)reader[fieldName]; } public static decimal? GetNullableDecimal_2(SqlDataReader reader, string fieldName) { if (reader.IsDBNull(r
0 2024-01-19
编程技术问答社区
如何管理解析DateTime的空对象,以便与ADO.NET作为DBNULL使用。
我有两个DateTime对象,生育日期和Hiredate.它们被正确格式化为字符串,当我将它们传递到数据访问层时,需要将它们解析到DateTime对象中. DateTime hD = DateTime.Parse(hire); DateTime bD = DateTime.Parse(birth); //incase of a datestring being passed through dateStringPassed = "7/2/1969"; 但有时,字符串hire和birth为空或空的"",如果代码是这样运行的,我会从解析空字符串中获得一个FormateXception错误.如何管理空解析,并允许DateTime(如果为空或空,则为DBNull.Value)? 我仍然无法管理用户没有通过日期的字符串,然后解析会崩溃我的代码. 我的出生日期参数如下,并检查变量(如果为null),请使用dbnull.value. 解决方案 您
4 2024-01-19
编程技术问答社区
将DBNull.Value和空文本框的值传递给数据库
我的页面上有一些文本框,因为它们是可选的,并且我有此dal code parameters.Add(new SqlParameter("@FirstName", FirstName)); parameters.Add(new SqlParameter("@LastName", LastName)); parameters.Add(new SqlParameter("@DisplayName", DisplayName)); parameters.Add(new SqlParameter("@BirthDate", BirthDate)); parameters.Add(new SqlParameter("@Gender", Gender)); 这些字段中的任何一个都可以为空.问题是当他们空的时候,我会收到Procedure XXX requires @FirstName which was not supplied 然后我将代码更改为 parameters.Add(
2 2024-01-19
编程技术问答社区
C# ADO.NET:空值和DbNull-是否有更有效的语法?
我有一个DateTime?我正在尝试使用DbParameter插入字段.我正在创建类似的参数: DbParameter datePrm = updateStmt.CreateParameter(); datePrm.ParameterName = "@change_date"; ,然后我想在考虑nulls. 时将DateTime?的值放入dataPrm.Value中 我以为最初会很聪明: datePrm.Value = nullableDate ?? DBNull.Value; 但由于错误而失败 操作员'??'不能应用于类型的" system.datetime?"的操作数?和'system.dbnull' 所以我想只有第二个参数是第一个参数的不可删除版本时才起作用.所以我去了: datePrm.Value = nullableDate.HasValue ? nullableDate.Value : DBNull.Value; 但这也不起作用:
20 2024-01-19
编程技术问答社区
Informix(C#)。如何正确设置/取消一个blob字段?
IBM Informix SDK: 语句:Update mytable set myblobcolumn = ? where myid = 1; using (IfxConnection conn = GetIfxConnection()) using (IfxCommand cmd = new IfxCommand(updateSql, conn)) { var param = new IfxParameter("myblobcolumn", IfxType.Blob) { IsNullable = true }; cmd.Parameters.Add(param).Value = DBNull.Value cmd.ExecuteNonQuery(); //ERROR [HY000] [Informix .NET provider][Informix]Illegal attempt to use Text/Byte host variable. }
0 2024-01-06
编程技术问答社区
在.net4中使用带有Dbnull值的数据加载器
我听说框架4中有一种现场扩展方法,该方法允许一个人从dataReader接收null值,而无需进行首次测试的过程,如果不是null,则...等.这里( msdn ),但我不知道如何在代码中使用它(对.NET是相对较新的,并且以前从未使用过扩展方法).如果有人可以举例说明. 这是我尝试实现的,但是当返回DBNULL中的任何一个列中时,它都会返回错误. Reader.Read() Dim Val As Nullable(Of Double) = Reader.GetDecimal(0) Dim Vol As Nullable(Of Long) = Reader.GetInt32(1) 解决方案 这些扩展方法与DataRow - I.E. DataTable ... 不是 IDataReader(etc). 不过,您可以在这里使用条件 - IIf在VB中或在C#中做您想做的事: double? val = reader.IsDBNull(index) ? (double
2 2024-01-06
编程技术问答社区
把一个空的东西投进去?
我今天与一位同事进行了有趣的讨论.我们正在辩论C#中的两种代码. 代码片段1: if(!reader.IsDBNull(2)) { long? variable1 = reader.GetInt64(2) } 代码段2: long variable1 = reader.IsDBNull(2) ? (long?) null : reader.GetInt64(2) 问题是:将无效的时间变成无效的长时间是一个好习惯吗?还是您愿意使用传统的if语句避免施放null可为无效的长时间. 解决方案 表达式(type?)null,default(type?)和new Nullable()最终被编译到相同的opcodes中: long? x = (long?)null; long? y = default(long?); long? z = new Nullable(); 变成:
2 2024-01-05
编程技术问答社区
检查DBNull会抛出一个StrongTypingException
我正在使用数据集从数据库中提取数据.连续的一个字段是NULL.我知道这个.但是,以下vb.net代码抛出StrongTypingException(在数据集设计器中的自动化get_somefield()方法中): If Not IsDBNull(aRow.SomeField) Then 'do something End If 根据文档和这个问题 P> 编辑:If aRow.SomeField is DBNull.Value Then还返回相同的错误. argh. 解决方案 区别在于,在相关的问题中,它通过索引来谈论一个未型值(即object).当您通过.SomeField进行时,该类型已包含在内 - 因此可以是int等.在int上尝试IsDBNull是没有意义的从不 be DBNull. 本质上是SomeField是包装纸(请求c#accent ...) public int SomeField { get { return (int) this[
4 2024-01-05
编程技术问答社区
操作符'??'不能应用于'string'和'System.DBNull'。
我有以下C#代码: sqlCommand.Parameters.AddWithValue("@Parameter", table.Value ?? DBNull.Value); ,但它引发了以下汇编错误: 操作员??不能应用于类型string和System.DBNull 的操作数 为什么编译器不允许此语法? 解决方案 两个操作数都必须是对象.使用显式演员: (object)table.Value ?? DBNull.Value; 其他解决方案 string和System.DBNull之间没有自动转换 sqlCommandObject.Parameters.AddWithValue("@Parameter", table.Value ?? (object)DBNull.Value); 其他解决方案 而不是使用dbnull.value,您可以使用convert.d
6 2024-01-04
编程技术问答社区
当我使用XmlSerialiser反序列化我的DbNull时,为什么它不是一个单子呢?
我一直以为dbnull.value是单身人士.因此,您可以做这样的事情: vb.net: If someObject Is DbNull.Value Then ... End if c#: If (someObject == DbNull.Value) { ... } 但是最近,我使用XMLSerialiser序列化了一个dbnull实例,突然间它不再是单身人士了.键入比较操作(例如C#(OBJ是DBNULL))虽然可以. 代码如下: [Serializable, System.Xml.Serialization.XmlInclude(typeof(DBNull))] public class SerialiseMe { public SerialiseMe() { } public SerialiseMe(object value) { this.ICanBeDbNull = value;
4 2024-01-04
编程技术问答社区
我应该用什么来比较DBNull?使用DBNull.Value或ToString().IsNullOrEmpty()。
我可以使用任何方法在数据行上检查DBnull. 使用 if(dr[0][0]==DBNull.Value) //do somethin 或通过做 if(dr[0][0].ToString().IsNullOrEmpty()) //do something 在这两种情况下,我都会得到相同的结果. 但是哪一种是正确的方法.这将使用更少的资源 解决方案 第一种方法有些正确. 但是,更接受的方法是: if ( dr[0][0] is DBNull ) 第二种方法绝对是不正确的.如果您使用第二种方式,则在两种情况下将获得真实: 您的价值是dbnull 您的价值是一个空字符串 其他解决方案 从概念上讲,与DBNull.Value的比较是正确的. 您也可以使用: if (Convert.IsDBNull(dr[0])) { } 您也可以使用,我不喜欢它,纯粹是因为它是一种类型的比较,而不是价值比较: if (dr[
4 2024-01-03
编程技术问答社区
SQLite相当于ISNULL()、NVL()、IFNULL()或COALESCE()。
我想避免在我的代码中进行许多检查: 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似乎无法识别其中任何一个. 有人有任何建议或知道这样做的更好方法吗?不幸的是,数据库没有所有字段的默认值.另外,在某些情况下,我需要使用一些
4 2024-01-02
编程技术问答社区
最有效的方法是检查DBNull,然后赋值给一个变量?
这个问题偶尔会出现,但我没有看到一个令人满意的答案. 典型的模式是(行是 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()应该更快,但也许编译器知道一些技巧我不? 第二个问题,是值得缓存行的值[" value"]还是编译器会优化索引器? 例如: object valueHolder; if (DBNull.Value == (valueHolder = r
4 2024-01-02
编程技术问答社区
DBNull的意义何在?
在.net中有null参考,它在任何地方都用来表示对象引用是空的,然后有DBNull> DBNull,该DBNull被数据库驱动程序(以及其他几个)用来表示. ..几乎相同的事情.自然,这会造成很多混乱和conversion依的例程,等等. . 为什么原始.NET作者决定做到这一点?对我来说,这是没有意义的.他们的文档也没有道理: dbnull类表示不存在的值.例如,在数据库中,表的一行中的列可能不包含任何数据.也就是说,该列被认为根本不存在,而不仅仅是没有值. dbnull对象表示不存在的列.此外,com Interop使用dbnull类来区分vt_null变体,该vt_null变体表示不存在的值和vt_empty变体,该变体表示未指定的值. . "不存在"这是什么?存在列,它只是没有特定行的值.如果不存在,我会得到一个例外,试图访问特定单元格,而不是DBNull!我可以理解需要区分VT_NULL和VT_EMPTY,但是为什么不做COMEmpty类呢?在整个.NE
2 2024-01-02
编程技术问答社区
将dbnull转换为字符串。在数据库中记录dbnull.value,而不是Nothing
i在VB.NET中具有使用参数查询的INSERTRECORD函数.如果没有给出错误日期,我需要将dbnull.value插入db而不是""(没有). . Dim strErrorDate2 As DateTime = Request.Form("dateOfErrorDatePicker2").ToString .Add(New SqlParameter("@ErrorDate2", If(strErrorDate2 Nothing, strErrorDate2.Date, DBNull.Value))) 我不断在dbnull上遇到转换错误.最初,它有自己的if/else block我初始化了变量,但我不知道如何正确转换它.我尝试了IF IF,但我仍然需要进行转换或尝试其他方法. 有什么想法吗?问题在于,当我将一个空字符串或日期时间插入数据库中时,它会记录在可能的日期,例如1/1/1900. 编辑:"不能推断出假定的普通类型'对象'."那是我目前遇到的错误.
4 2023-11-14
编程技术问答社区
运算符'='未针对类型为'dbnull'和类型'dbnull定义
使用sqldatareader(即"读者")时,我在尝试检查值是否为dbnull时遇到了以下错误. 运算符'='不是针对'dbnull'的类型定义的,并且类型为" dbnull". 使用以下代码时: If reader("MyColumn") = DBNull.Value Then '... End If 我通过使用对isdbnull()的调用来绕过错误,我怀疑这是由于" is"和"'=". 之间的差异. 但是,我的问题是:为什么不可能使用'='运算符进行比较? 解决方案 并非所有类型都可以与=操作员一起使用.当一种类型定义了各种操作员应该如何使用的逻辑时,它称为"操作员过载"(当然,这有点令人困惑,因为它与方法过载无关,并且完全不同). base Object类型不会超载=运算符,因此,当创建自定义类时,它不会继承=运算符从Object>继承.因此,只有专门超载操作员实际上可以使用的类型.例如,以下代码不会编译: Module Modul
4 2023-11-14
编程技术问答社区
.NET DBNull与Nothing在所有变量类型中的对比?
我对.NET中的空值和变量有些困惑. (首选VB) 有什么方法可以检查任何给定变量的"无效",无论其是对象还是值类型?还是我的空检查必须始终预期它是检查值类型(例如System.Integer)还是对象? 我猜我要寻找的是一个检查所有可能的null-nells的函数.也就是说,任何类型的变量 a)从未分配一个值,因为声明为 b)从数据对象(来自数据库)分配一个零值 c)设置了一个等于null 的另一个变量值 d)设置为从未设置或过期的ASP.NET会话/应用程序变量. 在处理.NET中处理空方案时,是否有一般最佳实践? 更新:当我谈论一个值类型为" null"时,我的确是一个从未设置的值类型目的. 解决方案 正常值类型(布尔,ints,longs,float,double,unum and enum and unum and structs)都不可用. 所有值类型的默认值为0. CLR除非设置,否则CLR将不允许您访问变量
8 2023-11-14
编程技术问答社区
避免在每一列上检查DataRow.IsDBNull?
我的代码比我可以自动将IsDBNull设置为""的时间长2倍,或者只是在没有错误的情况下滚动. 这是我的代码: Dim conn As New SqlConnection conn.ConnectionString = Module1.DBConn2 Dim sqlCommand = New SqlCommand("SELECT * FROM table", conn) conn.Open() Dim sqlDataset As DataSet = New DataSet() Dim sqlDataAdapter As SqlDataAdapter = New SqlDataAdapter(sqlCommand) sqlDataAdapter.Fill(sqlDataset) conn.Close() For Each rs As DataRow In sqlDataset.Tables(0).Rows If Not IsDBNull(rs("column")) T
4 2023-11-14
编程技术问答社区
操作符类型冲突:nvarchar与image不兼容
我正在使用SQL Server 2008存储过程来创建一个新记录 这个语法: cmd.Parameters.Add("@photo", DBNull.Value) cmd.ExecuteNonQuery() ,但结果是: Operand type clash: nvarchar is incompatible with image 照片不是唯一的参数,而是唯一的图像,我不是通过 nvarchar,但一个无效的值,我错过了什么吗? 解决方案 如果您将DBNull.Value作为值传递,则ADO.NET无法弄清楚该参数应该是什么类型.如果指定字符串或整数值,则可以从提供的值派生SQL参数的类型 - 但是应将DBNull.Value变成什么类型​​? 传递零值时,您需要明确指定SqlDbType自己: Dim photoParam As New SqlParameter("@photo", SqlDbType.Image) photoParam.Val
18 2023-11-14
编程技术问答社区