调用SQL Server存储过程时,VB.Net的Nothing是否等价于NULL?
问题解答
关于Nothing与SQL Server NULL的对应关系:
VB.Net中的Nothing对于可空值类型(比如Int32?)来说,代表变量未赋值的状态,但直接将Nothing传给AddWithValue时,ADO.NET不会自动转换为SQL Server的NULL。你必须显式传递DBNull.Value,才能让SQL Server识别为参数的NULL值。当前代码的问题:
你现在使用的classid.GetValueOrDefault()和streamid.GetValueOrDefault(),当可空变量为Nothing时,会返回Int32的默认值0,而非NULL。这导致存储过程接收到的参数是0,而非你期望的默认NULL,自然查不到匹配记录——毕竟直接在SQL Server执行时,参数用的是默认NULL,和代码传0的逻辑完全不同。正确的传参方式:
针对可空变量,需判断其是否有值,有值则传变量值,无值则传DBNull.Value,示例代码如下:cmd.SelectCommand.Parameters.AddWithValue("@class", If(classid.HasValue, classid.Value, DBNull.Value)) cmd.SelectCommand.Parameters.AddWithValue("@stream", If(streamid.HasValue, streamid.Value, DBNull.Value))这样当变量为
Nothing时,存储过程会接收到NULL,触发参数的默认值逻辑,和你直接在SQL Server执行的效果一致。
内容的提问来源于stack exchange,提问作者Sumeet Kumar
相关产品推荐
相关产品推荐

