我有一个SQL查询,其参数在数据库(Sql Server)中可以为null.更新方法正常工作,直到该用户在字段中放置一个空白,这将为DataTime对象生成一个空值(此对象可以为空).问题是什么时候dbCommand.ExecuteNonQuery();.
以下是我为此字段构建参数的方法:
IDataParameter dbParam_au_id = new SqlParameter();
dbParam_au_id.ParameterName = "@birthday";
dbParam_au_id.Value = birthday;
dbParam_au_id.DbType = DbType.DateTime;
dbCommand.Parameters.Add(dbParam_au_id);
Run Code Online (Sandbox Code Playgroud)
我尝试将生日的null值转换为DBNull.Value,如下所示:
IDataParameter dbParam_au_id = new SqlParameter();
dbParam_au_id.ParameterName = "@birthday";
dbParam_au_id.Value = birthday??DBNull.Value;
dbParam_au_id.DbType = DbType.DateTime;
dbCommand.Parameters.Add(dbParam_au_id);
Run Code Online (Sandbox Code Playgroud)
但是这段代码不能编译,我得到错误:
错误1运算符'??' 不能应用于'System.DateTime?'类型的操作数 和'System.DBNull'
任何的想法?
通过C#在Boxing/Unboxing值类型上从CLR中提取...
在Boxing上:如果可空实例不为null,则CLR将该值从可空实例中取出并将其装箱.换句话说,值为5的Nullable <Int32>被装入一个值为5的boxed-Int32.
在取消装箱:取消装箱只是获取对盒装对象的未装箱部分的引用的行为.问题是盒装值类型不能简单地拆箱成该值类型的可空版本,因为盒装值中没有boolean hasValue字段.因此,当将值类型拆箱到可空版本时,CLR必须分配Nullable <T>对象,将hasValue字段初始化为true,并将value字段设置为盒装值类型中的相同值.这会影响您的应用程序性能(拆箱期间的内存分配).
为什么CLR团队为Nullable类型经历了这么多麻烦?为什么不首先将它装入Nullable <Int32>?
我有以下VB.NET函数,例如:
Public Function MyFunction (Of TData) (ByVal InParam As Integer) As TData
End Sub
Run Code Online (Sandbox Code Playgroud)
我如何在函数中确定是否TData为NULLable类型?
我对MySQL有点不熟练,所以我希望我能在这里找到一些关于我的问题的建议.
基本上我有两个表,为方便起见,称它们为A和B. 两个表都有一个可以为空的C列varchar.当我使用C加入A和B时,我丢失了任何表中C为NULL的所有行.我知道这在MySQL中是正常的,但我想得到的是一个包含两个表中C为NULL的行组合的连接.我发现下面的查询似乎运行良好.
SELECT *
FROM A JOIN B
ON (A.C IS NULL AND B.C IS NULL) OR (A.C IS NOT NULL AND B.C IS NOT NULL AND A.C = B.C)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,这个查询是我能得到的最好的,还是有办法让这个联接变得更好?谢谢!
我负责一个LINQ提供程序,它对C#代码执行一些运行时评估.举个例子:
int? thing = null;
accessor.Product.Where(p => p.anInt == thing.GetValueOrDefault(-1))
Run Code Online (Sandbox Code Playgroud)
目前上述代码由于为thingnull 而无法与我的LINQ提供程序一起使用.
虽然我已经使用C#很长时间了,但我不知道如何实现GetValueOrDefault,因此我应该如何解决这个问题.
所以我的问题是:GetValueOrDefault在调用它的实例为空的情况下如何工作?为什么不NullReferenceException抛出?
接下来的问题:我应该如何复制GetValueOrDefault使用反射的调用,因为我需要处理空值.
An int(Int32)的内存占用为4个字节.但是什么是内存占用:
int? i = null;
Run Code Online (Sandbox Code Playgroud)
并且:
int? i = 3;
Run Code Online (Sandbox Code Playgroud)
这是一般的还是类型依赖的?
我正在读这篇文章: 在SQL中获取null == null
并且一致认为,当尝试测试两个(可为空)sql列之间的相等性时,正确的方法是:
where ((A=B) OR (A IS NULL AND B IS NULL))
Run Code Online (Sandbox Code Playgroud)
当A和B为NULL时,(A = B)仍然返回FALSE,因为NULL不等于NULL.这就是需要额外检查的原因.
在测试不平等时呢?根据上面的讨论,它让我认为,为了测试不平等,我需要做一些像:
WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))
Run Code Online (Sandbox Code Playgroud)
但是,我注意到这没有必要(至少在informix 11.5上没有),我可以这样做:
where (A<>B)
Run Code Online (Sandbox Code Playgroud)
如果A和B为NULL,则返回FALSE.如果NULL不等于NULL,那么这不应该返回TRUE吗?
编辑
这些都是很好的答案,但我认为我的问题有点模糊.请允许我改写一下:
鉴于A或B都可以为NULL,是否足以检查它们的不等式
where (A<>B)
Run Code Online (Sandbox Code Playgroud)
或者我需要明确检查它:
WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))
Run Code Online (Sandbox Code Playgroud)
请参阅此主题以获得此问题的答案.
使用四个表.
用户 - >具有基本用户信息,包括用户ID和
离开(int)
组 - >基本组信息,包括groupid
GroupsMembers - >表,其中包含组与其成员之间的关系,多对多关系,因此groupid和userid是列
部门 - >基本部门信息,包括deptid
我有一个fk从users表中的departmentid到departments表中的deparmtnet id.
FK从组groupid到groupsmembers groupid FK从用户userid到groupsmembers userid
这允许edmx中的组具有用户导航属性,该属性将包含该组的所有成员.
var grp = grpSource.FirstOrDefault(g => g.GroupID == groupID)
if (grp.GroupID > 0)
{
var userQuery = from u in grp.Users
where !u.Deleted
select u;
userQuery = userQuery.OrderBy(u => u.Department.Name);
}
Run Code Online (Sandbox Code Playgroud)
我包括Users.Department.
问题出现是因为用户不必拥有部门,因此departmentid列可以为空.如果有任何用户为departmentid为null,则orderby中断并表示u.Department为null.如果没有离开是空的,那就很有效.我需要一种基于Department.Name进行排序的方法,即使有null的离开.有什么建议?
有人可以请你解释为什么调用ToString()一个空的引用类型会导致一个异常(在我看来这是完全合理的,你无法调用任何方法!)但是调用ToString()一个空的Nullable(Of T)返回String.Empty?这对我来说是一个惊喜,因为我认为这种行为在各种类型中都是一致的.
Nullable<Guid> value = null;
Stock stock = null;
string result = value.ToString(); //Returns empty string
string result1 = stock.ToString(); //Causes a NullReferenceException
Run Code Online (Sandbox Code Playgroud) 我从未在C#代码中使用过可空类型.现在我决定通过在我的代码中引入可空类型来改变我的编码实践.
在应用程序编程的情况下,在从普通数据类型转换为可空数据类型时,应该对编码实践进行哪些主要更改?
应该注意哪些方面?
我应该经常注意哪些要点?
nullable ×10
c# ×6
.net ×4
null ×2
sql ×2
clr ×1
database ×1
generics ×1
join ×1
memory ×1
mysql ×1
sql-order-by ×1
sql-server ×1
value-type ×1
vb.net ×1