【问题标题】:Converting Empty String to NULL Double将空字符串转换为 NULL 双精度
【发布时间】:2017-08-24 21:43:59
【问题描述】:

我花了一天的大部分时间试图找到这个问题的答案。我认为这很容易,但没有什么是特定于我正在尝试做的事情。所以我希望有人能提供帮助。

我将价值观从一个系统带到另一个系统。我有一些字段以字符串形式出现,但它们需要以 DOUBLE 的形式进入新系统。当有空字符串(“”)并且它试图将其存储为双精度时,就会出现问题。我什么都试过了。

dbnull.value
Double.TryParse
CDBL()
Double?
VAL() 

等等...无法让它工作,我不知道为什么。

代码如下:

Dim specvertclr As String = dt23.Rows(0).ItemArray.GetValue(38).ToString()

然后,当我将其插入我的数据库时,我收到错误,因为字段类型是 NUMERIC,我正在尝试插入“”

我确实有这个工作:

 Dim specvertclr As String

                        If dt23.Rows(0).ItemArray.GetValue(38).ToString() = "" Then
                            specvertclr = CStr(0)
                        Else
                            specvertclr = dt23.Rows(0).ItemArray.GetValue(38).ToString()
                        End If

但是这样做的问题是它插入了一个 0 值,而 0 与 NULL 不同。当源数据库中的字符串为空时,我希望目标数据库 (SQLCE) 中的 NUMERIC 字段为空。

有什么帮助吗?

这是我尝试过的:

 Dim specvertclr As Nullable(Of Double) = CType(dt23.Rows(0).ItemArray.GetValue(38).ToString(), Double?)

然后我的插入是基本的,程序甚至在到达这里之前就抛出了一个错误。我知道这部分是正确的。

  Dim cmd2 As SqlCeCommand = conn.CreateCommand()
                            cmd2.CommandText = "Insert into [Attr_Bridge] ([VERTCLR])  VALUES (?)"
                            With cmd2.Parameters
  .AddWithValue("P1", specvertclr)
end with

【问题讨论】:

  • 看看 Double.TryParse - msdn.microsoft.com/en-us/library/…
  • 字符串不是数字。 specvertclr 是一个字符串。您需要使用nullable double var
  • 我也试过了,我得到了以下错误:从字符串“”到类型“双”的转换无效。
  • 那么把代码贴在你使用可空双精度的地方。以及用于将其插入数据库的代码
  • 好的,编辑我的帖子以包含我尝试过的部分

标签: sql vb.net


【解决方案1】:

在将字符串添加到数据库之前,您需要检查字符串的内容

Dim specvertclr = dt23.Rows(0).ItemArray.GetValue(38).ToString() 
....
Dim cmd2 As SqlCeCommand = conn.CreateCommand()
cmd2.CommandText = "Insert into [Attr_Bridge] ([VERTCLR])  VALUES (@P1)"
With cmd2.Parameters
   .Add("@P1", SqlDbType.Float).Value = If(String.IsNullOrEmpty(specvertclr), DBNull.Value, CType(specvertclr, Object))

【讨论】:

  • 我将使用什么类型... SqlDbtype.Float?没有双重选择。
  • 不幸的是,这看起来不起作用......它说它需要一个我没有提供的参数。
  • 我的插入语句仍然有问题。出于本示例的目的,我将其缩减为 1 个参数,因为这是唯一的问题 - 其他所有内容都可以正常进入数据库。现在我修复了一个参数,它说参数 #1 有问题。我会在我原来的问题中发布整个内容,并告诉我你是否发现它有任何问题......我很困惑。
【解决方案2】:

结果证明这是答案......感谢 Arminius 提供的链接文章让我找到了正确的答案......感谢史蒂夫的时间和帮助!

 Dim specvertclr As String = dt23.Rows(0).ItemArray.GetValue(38).ToString()

                    Dim oerrorspec As Object = System.DBNull.Value

                    If specvertclr <> Nothing Then oerrorspec = specvertclr

然后在参数部分我使用了这个

.Add(New SqlCeParameter("@P41", oerrorspec))

【讨论】:

    【解决方案3】:

    我遇到了这个问题,因为我遇到了同样的问题。我正在创建一个应用程序,其中一个输入是可选的,我不希望用户担心输入零,这样他们就不会收到错误。所以我的问题是如何将“”字符串转换为双精度?我想出了以下内容:

    Dim Nontaxable As Double

            If txtNontaxable.Text IsNot "" Then
    
                Nontaxable = CDbl(txtNontaxable.Text)
    
            Else
                txtNontaxable.Text = 0
    
            End If
    

    如果字符串不为空,则可以正常转换,如果为空,则用零替换,然后再正常转换。希望这对遇到同样问题的人有所帮助。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2013-03-23
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多