【问题标题】:Input string was not in a correct format? but it is输入字符串的格式不正确?但它是
【发布时间】:2015-12-30 14:15:00
【问题描述】:

我的代码正在执行我想要的操作,但它显示此行的错误“输入字符串格式不正确”:da.SelectCommand.Parameters.AddWithValue("@isbn", Convert.ToDecimal(cboISBN.SelectedValue.ToString())) 在这里,我将提供更多代码,这样我所做的事情就可以理解了:

Private Sub cboISBN_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboISBN.SelectedIndexChanged
    Try
        If (cboISBN.SelectedIndex <> -1) Then
            da = New SqlDataAdapter("SELECT isbn FROM book WHERE isbn =@isbn", cn)
            da.SelectCommand.Parameters.AddWithValue("@isbn", Convert.ToDecimal(cboISBN.SelectedValue.ToString()))
            dt = New DataTable
            da.Fill(dt)
            If dt.Rows.Count > 0 Then
                da = New SqlDataAdapter("SELECT no_of_books FROM book WHERE isbn =@isbn", cn)
                da.SelectCommand.Parameters.AddWithValue("@isbn", Convert.ToDecimal(cboISBN.SelectedValue.ToString()))
                dt = New DataTable
                da.Fill(dt)
                TxtNo_of_Books.Text = dt.Rows(0).Item("no_of_books")
            End If
        End If
    Catch ex As Exception
        MessageBox.Show("Not Completed Because OF The Following Error " & "%" & ex.Message & "%", "Error", _
                       MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
End Sub

我提供的值是数字而不是字符串,请不要问我为什么将十进制用于 ISBN[我的选择;-)]。最后一件事,我只是没有来这里发布我的问题并得到答案,我在谷歌上搜索了 2 天,但没有找到解决问题的地方!

【问题讨论】:

  • 调试这个的方法是在抛出异常的时候检查cboISBN.SelectedValue.ToString()的值。您认为它是数字,但 ToDecimal 方法已确定它不是。
  • 所以...如果cboISBN.SelectedValue 的值为十进制,为什么需要toString/Convert?试试通过cboISBN.SelectedValue 或者CType(cboISBN.SelectedValue, Decimal) 那么DB中列的数据类型是什么?
  • 数据库似乎与问题无关,异常是抱怨无效的String,被Convert.ToDecimal抛出。
  • 这是否只发生在这个 isbn 值上?如果是这样,请仔细检查以确保您没有为一个或多个零输入字母 O
  • @Plutonix。我什至不确定是否需要加入。我认为第二个查询就足够了。它要么返回 no_of_books 的结果,要么不返回任何行。在使用 if 语句运行该查询之后,所有这些都可以涵盖。如果 rows.count = 0 则 0 本书使用从查询字段中接收到的值。

标签: sql-server vb.net visual-studio


【解决方案1】:

decimal.Parse 有一个重载来定义数字样式。

您可以使用 Any, 来处理所有事情。 (例如,千位分隔符、空格等)

Convert.ToDecimal(cboISBN.SelectedValue.ToString(), 
    System.Globalization.NumberStyles.Any)

第二个问题可能是您的线程在不同的文化中运行,而不是其他将十进制转换为字符串的线程/应用程序。 例如在土耳其,十进制和千位分隔符反之亦然。

如果您在十进制分隔符中有一个点和千位逗号,您可以使用 Invariant Culture 进行解析,如下所示:

Convert.ToDecimal(cboISBN.SelectedValue.ToString(), 
    System.Globalization.NumberStyles.Any,
    System.Globalization.CultureInfo.InvariantCulture)

【讨论】:

  • OP认为输入字符串是“1000000000002”,不涉及分隔符。
  • 对,我的答案是在我看到数字之前。但即便如此,我认为在两边都使用 InvariantCulture(在此方法之前转换为字符串并在此方法中转换回十进制)是一个更好的习惯, 即使是整数。
【解决方案2】:

要真正获得SelectedValue而不是我设置cboISBN.selectedIndex = -1的表单中已经加载的值,我们必须将组合框的combobox_SelectedIndexChanged更改为combobox_SelectionChangeCommittedevent,然后它将顺利运行而不会出现任何错误。有关更多说明,请参见下面的代码作为示例:

Private Sub cboISBN_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboISBN.SelectionChangeCommitted
        Dim v As Decimal = cboISBN.SelectedValue
        If (cboISBN.SelectedIndex <> -1) Then
            da = New SqlDataAdapter("SELECT isbn, no_of_books FROM book WHERE isbn =@isbn", cn)
            da.SelectCommand.Parameters.AddWithValue("@isbn", v)
            dt = New DataTable
            da.Fill(dt)
            If dt.Rows.Count > 0 Then
                TxtNo_of_Books.Text = dt.Rows(0).Item("no_of_books")
            End If
        End If
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2013-08-22
    相关资源
    最近更新 更多