作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经开始将我的应用程序转换为使用 Option Strict On。我一直在做 CStr、Ctype 等,而且进展顺利。
SQLCommand.Parameters.AddWithValue("@TERMINATE", If(IsNothing(txtEarningsTerminated.DateValue), DBNull.Value, txtEarningsTerminated.DateValue))
然后我点击了这个。 txtEarningsTerminated.DateValue 是一个自定义的屏蔽文本框。当它的值为 Nothing 时,我不想在数据库中存储任何内容。但是,它指出
Cannot infer a common type, and Option Strict On does not allow 'Object' to be assumed.
当我将 DBNull.Value 更改为“”或什么都不更改时,错误消失了。然而,作为 Nothing,它在运行时失败,声明
The parameterized query '(@CONTROL int,@CLIENTCODE nvarchar(10),@NoBill int,@TERMINATE nv' expects the parameter '@TERMINATE', which was not supplied.
我想在数据库中放入一个 NULL。该值可以是日期,然后变为 NULL。
我该如何翻译才能在 Option Strict On 下不产生错误?
最佳答案
原因是因为运算符 If(condition, executeAndReturnIfTrue, executeAndReturnIfFalse)
期望 true
和 false
表达式将返回相同的类型。< br/>在您的情况下,如果结果为假,则返回 DbNull
类型,如果结果为假,则返回 String
(或您未提及的其他类型)。
如果更明确地创建SqlParameter
,那么您可以使用下一种方法:
Dim value As Object = Nothing
If txtEarningsTerminated.DateValue Is Nothing Then
value = DbNull.Value
Else
value = xtEarningsTerminated.DateValue
End If
Dim param As SqlParameter = New SqlParameter With
{
.ParameterName = "@TERMINATE",
.SqlDbType = SqlDbType.VarChar, 'Or use your correct type
.Value = value
}
如注释中所述,使用 AddWithValue
将强制 ADO.NET 自动为您的值确定 sql 类型,这可能会导致不同的问题。例如,每次您使用不同的值运行相同的查询时,您的查询计划将在您每次更改值时重新编译。
您可以为string
创建扩展方法
Public Module ExtensionsModule
Public Function DbNullIfNothing(this As String) As Object
If this Is Nothing Then Return DBNull.Value
Return this
End Function
End Module
然后使用它代替您的“内联 If 方法”
Dim value As String = Nothing
Dim param As SqlParameter = New SqlParameter With
{
.ParameterName = "@TERMINATE",
.SqlDbType = SqlDbType.VarChar,
.Value = value.DbNullIfNothing()
}
关于vb.net - Option Strict On 和 DBNull.Value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40409432/
我是一名优秀的程序员,十分优秀!