【问题标题】:VB.NET IIF StatementVB.NET IIF 语句
【发布时间】:2020-06-15 18:44:21
【问题描述】:

在 VB.NET 中,我尝试使用 SQL 参数将数据发送到 SQL Server 数据库,如果 datagridrow 的值没有,我尝试使用以下代码将字符串转换为十进制,然后发送 0 或使用转换为十进制参数.

SQL.Addparam("@amt", IIf(IsNothing(DataGridView2.Rows(index).Cells(7).Value), 0, CDec(DataGridView2.Rows(index).Cells(7).Value)))

(从我创建的类中调用 SQL 和 Addparam)

但是使用这段代码我得到错误“System.InvalidCastException: 'Conversion from string "" to type 'Decimal' is not valid.'"

我需要这方面的帮助。

谢谢

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    具体问题显然是您的“空”单元格实际上不包含空引用,即Nothing,而是一个空的String。您将需要测试空的String 以及或代替Nothing。如果您的单元格可能包含Nothing、空的StringDecimal 值,则应该可以:

    Dim cellValue = DataGridView2.Rows(index).Cells(7).Value
    
    SQL.Addparam("@amt",
                 If(String.IsNullOrEmpty(CStr(cellValue)),
                    Decimnal.Zero,
                    CDec(cellValue)))
    

    注意使用If 而不是IIf 和实际的Decimal 值作为零。 String.IsNullOrEmpty 将在一次调用中检测到Nothing 或空的String

    但这确实不是最好的解决方案。

    您似乎正在使用未绑定的网格,然后遍历行并单独保存每一行。那真的是错误的方法。您应该做的是使用适当的架构创建DataTable,如果需要,从数据库中填充它,将其绑定到网格,执行所需的编辑,然后只需一次调用即可保存整个DataTable到数据适配器上的Update

    如果您这样做,那么“空”单元格将包含DBNull.Value,并且 ADO.NET 将自动将 NULL 保存到您的数据库中。如果您不希望列中有 NULL 值,那么只需将 AllowDBNull 属性设置为 False 并将 DefaultValue 属性设置为您想要的任何值。

    要创建DataTable 架构,您可以在数据适配器上调用Fill 来执行此操作并填充数据,或者您可以调用FillSchema 来不检索任何数据。或者,您可以自己构建架构。

    【讨论】:

    • 你说得对,我正在尝试逐行保存 datagridview 中的值并添加更多不属于 datagridview 但需要添加到数据库的值。我相信你的建议是要走的路,会努力的。
    • 我已经编辑了我的答案以包括解决您当前问题的方法,但我肯定会建议以不同的方式处理整个事情。查看我的 ADO.NET 示例here
    • 太棒了,非常感谢您的帮助。我正在处理数据表,这对于将数据从 datagridview 发送到数据表仍然很有用。我试图不接触数据库,因为旧程序需要工作,我不知道这对我的数据库更改有何反应。
    猜你喜欢
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多