输入字符串的格式不正确?但它是

时间:2015-12-30 14:15:00

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

我的代码正在执行我想要的操作,除非它为此行显示错误“输入字符串的格式不正确”: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天以来没有找到一个地方来解决我的问题!

2 个答案:

答案 0 :(得分:2)

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)

答案 1 :(得分:0)

要真正得到SelectedValue而不是我在cboISBN.selectedIndex = -1设置的表单中已加载的值,我们必须将combobox_SelectedIndexChanged更改为combobox_SelectionChangeCommitted组合框的事件,然后它将工作顺利,没有任何错误。有关更多说明,请参阅以下代码作为示例:

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