gpt4 book ai didi

vb.net - Option Strict On 和 DBNull.Value

转载 作者:行者123 更新时间:2023-12-02 00:50:31 31 4
gpt4 key购买 nike

我已经开始将我的应用程序转换为使用 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) 期望 truefalse 表达式将返回相同的类型。< 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com