Недопустимо преобразование из строки «ual» в тип «Double»

#vb.net

#vb.net

Вопрос:

получить ошибку в этой строке

Ещё

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

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

Комментарии:

1. Ваша строка — это буквы, двойник — это число; вы не можете преобразовать буквы в число.

2. Пожалуйста, включите опцию Strict. Это процесс из 2 частей. Сначала для текущего проекта — в обозревателе решений дважды щелкните Мой проект. Выберите Compile слева. В раскрывающемся списке Option Strict выберите ВКЛ. Во-вторых, для будущих проектов — Перейдите в меню Сервис -> Параметры -> Проекты и решения -> VB Defaults. В раскрывающемся списке Параметр Строгий выберите ВКЛ. Это избавит вас от ошибок во время выполнения.

3. Вероятно, это очень помогло бы, если бы вы точно сообщили нам, где вы получили эту ошибку

4. Это большой объем кода, чтобы показать, что кажется ошибкой в одной строке.

5. извините, я впервые задаю вопрос в этой сети, извините

Ответ №1:

Какую базу данных вы используете, для которой требуется Odbc, а не ее собственный поставщик?

Я бы предположил, что метки изначально пусты, поэтому нет необходимости устанавливать значение .Text "" .

Call Ключевое слово больше не требуется.

Избавьтесь от Koneksi метода и объявлений Cmd and Rd . Объекты базы данных должны создаваться и размещаться в том методе, в котором они используются. Язык предоставляет Using...End Using блоки, которые заботятся об этом для нас, даже если есть ошибка.

Не обновляйте пользовательский интерфейс (заполняйте поле со списком, метки и т. Д.), Пока соединение открыто. Если вы используете a DataTable , считыватель (для которого требуется открытое соединение) может заполнить его, и соединение может быть закрыто.

Не объединяйте строки для построения инструкций sql. Всегда используйте параметры. Посмотрите ComboBox1.SelectedIndexChanged событие.

Наконец, в последнем методе я вижу вашу проблему в NomorOtomatic методе. Опция Strict поможет вам. Смотрите мой комментарий.

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

Старый Right метод vb6 возвращает a String . Вы не можете добавить единицу в строку. Компилятор пытается преобразовать Right(Rd.GetString(0), 3) в a Double , чтобы он мог выполнить добавление. По-видимому, то, что отображается "ual" , не может быть преобразовано в число.

Я заменил Right метод на Substring метод .net. См. https://docs.microsoft.com/en-us/dotnet/api/system.string.substring?view=net-5.0

Я добавил a .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" amp; (Hitung   1)
    Else
        TextBox1.Text = "ADM001"
    End If
End Sub
 

Кстати, что вы собираетесь делать, когда ваши цифры будут выше 999?

Комментарии:

1. @RevaDiva Вы включили If Not Integer.TryParse код? Если это так, вы не должны получать никаких ошибок; просто окно сообщения. Если в вашей базе данных неверные данные, вы не можете использовать этот метод. Это ужасный способ получить первичный ключ. Пусть база данных выполняет автоматическое числовое поле для создания PK.