首页 > 解决方案 > 从字符串“ual”到类型“Double”的转换无效

问题描述

在这一行得到错误

别的

        Hitung = Microsoft.VisualBasic.Right(Rd.GetString(0), 3) + 1
        

https://i.stack.imgur.com/wxrsO.png

标签: vb.net

解决方案


您使用的是什么数据库,而不是它自己的提供程序?

我会假设标签一开始是空的,所以不需要设置.Text"".

Call不再需要该关键字。

去掉 and 的方法和Koneksi声明。数据库对象应该在使用它们的方法中创建和处理。即使出现错误,该语言也提供了为我们处理此问题的块。CmdRdUsing...End Using

连接打开时不要更新用户界面(填写组合框、标签等)。如果您使用 a DataTable,阅读器(需要打开的连接)可以填充它并且可以关闭连接。

不要连接字符串来构建 sql 语句。始终使用参数。见 ComboBox1.SelectedIndexChanged事件。

最后,在最后一种方法中,我在方法中看到了您的问题NomorOtomatic。Option Strict 会帮助你。看我的评论。

Hitung = Microsoft.VisualBasic.Right(Rd.GetString(0), 3) + 1

旧的 vb6Right方法返回一个String. 您不能将一个添加到字符串。编译器正在尝试转换Right(Rd.GetString(0), 3)为 aDouble以便它可以执行加法。显然,返回的是"ual"不能转换为数字的。

我已经用Right.net方法替换了该Substring方法。请参阅https://docs.microsoft.com/en-us/dotnet/api/system.string.substring?view=net-5.0

我添加了一个.TryParse来检查是否有一个有效的数字,如果解析失败则优雅地退出。

Private ConStr As String = "Your connection string"

Dim tgljualMySQL As String

Sub kondisiawal()
    lbltanggal.Text = Today
    lbladmin.Text = FormMenuUtama.STLabel4.Text
    TextBox3.Enabled = False
    Label12.Text = "0"
    munculkodepelanggan()
    NomorOtomatis()
    BuatKolom()
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    lbljam.Text = TimeOfDay.ToString
End Sub

Private Sub Formtransjual_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    kondisiawal()
End Sub

Sub munculkodepelanggan()
    Dim dt As New DataTable
    Using Conn As New OdbcConnection(ConStr),
            Cmd As New OdbcCommand("select * from tbl_pelanggan", Conn)
        Conn.Open()
        Using Rd = Cmd.ExecuteReader
            dt.Load(Rd)
        End Using
    End Using
    For Each row As DataRow In dt.Rows
        ComboBox1.Items.Add(row(0))
    Next
End Sub

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    Dim dt As New DataTable
    Using Conn As New OdbcConnection(ConStr),
            Cmd As New OdbcCommand("select * from tbl_pelanggan where kodepelanggan = ?;", Conn)
        Cmd.Parameters.Add("@ComboText", OdbcType.NVarChar, 50).Value = ComboBox1.Text
        Conn.Open()
        Using Rd = Cmd.ExecuteReader
            dt.Load(Rd)
        End Using
    End Using
    If dt.Rows.Count > 0 Then
        lblnamaplg.Text = dt(0)("namapelanggan")
        lblalamat.Text = dt(0)("alamatpelanggan")
        lbltelepon.Text = dt(0)("telppelanggan")
    End If
End Sub

Sub NomorOtomatis()
    Dim dt As New DataTable
    Using Conn As New OdbcConnection(ConStr),
            Cmd = New OdbcCommand("Select * from tbl_jual where nojual in(select max(nojual) from tbl_jual)", Conn)
        Conn.Open()
        Using Rd = Cmd.ExecuteReader
            dt.Load(Rd)
        End Using
    End Using
    If dt.Rows.Count > 0 Then
        Dim StrHitung = dt(0)(0).ToString
        Dim Hitung As Integer
        If Not Integer.TryParse(StrHitung.Substring(StrHitung.Length - 3), Hitung) Then
            MessageBox.Show($"Database returned {StrHitung}. The right 3 characters cannot be converted to a number")
            Exit Sub
        End If
        TextBox1.Text = "ADM" & (Hitung + 1)
    Else
        TextBox1.Text = "ADM001"
    End If
End Sub

顺便说一句,当你的数字超过 999 时,你会怎么做?


推荐阅读