"Conversion from string to type Double is not valid" error VB.NET
double, mysql, string, type-conversion, vb.net
Solution
The problem is that you are joining a string with a `+`. You need to replace the `+` with `&`. I also recommend adding `.ToString` to your `m_decBalance`, as this will tell the compiler to treat `m_decBalance` as a `string`, like so:
MsgBox("You balance is " & " " & m_decBalance.ToString)
The reason you are getting the error is that the compiler tries to convert the string to a numeric value when `+` is used with a number. For example, the following will display a messagebox with the value of `10`:
MsgBox("5 " + " " + 5)
and
Dim Val As Integer = "20 " + 15
will result in `Val` being `35`
When you want to join strings, I recommend using the `&`, as this tells the compiler that you don't wish to convert the string to a number, and instead you wish to join them as strings.
I would also like to suggest using `Option Strict On`, as this will help prevent errors like this from happening, as it prevent you from recompiling if you have any `implicit conversions` (where the compiler has to guess which type you want to convert to)
Problem
I'm trying to display a logged in users balance from a database in VB. However once I click the Check Balance button it produces the error `Conversion from string "Your balance is " to type 'Double' is not valid`. I've tried different ways a converting it from a string to a double, I thought maybe it was because I had m_decBalance declared as a decimal, but that didn't change anything. Can anyone help me? Here's my code: ``` Imports MySql.Data Imports MySql.Data.MySqlClient Public Class Form1 Dim dbCon As MySqlConnection Dim strQuery As String = "" Dim SQLcmd As MySqlCommand Dim DataReader As MySqlDataReader Private m_strPass As String Private m_decBalance As Decimal Private m_strName As String Private m_strUserPass As String Private m_strCardNumber As String Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btnLogin.Click 'Assign users guessed password to variable m_strUserPass = txtPass.Text 'Invoke RetrieveAccountInformation() ' determine if Password is correct or not If m_strUserPass = m_strPass Then lblWelcome.Visible = True lblWelcome.Text = "Welcome" + " " + m_strName txtPass.Enabled = False btnBalance.Enabled = True Else ' indicate that incorrect password was provided lblWelcome.Visible = True lblWelcome.Text = "Sorry, Password is incorrect." _ & "Please retry ." ' clear user's previous PIN entry m_strUserPass = "" End If txtPass.Clear() ' clear TextBox End Sub ' load application Form Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 'Prepare connection and query Try dbCon = New MySqlConnection("Server=localhost;Database=test;Uid=root;Pwd=mysql") strQuery = "SELECT CardNumber " & "FROM Account" SQLcmd = New MySqlCommand(strQuery, dbCon) 'Open the connection dbCon.Open() ' create database reader to read information from database DataReader = SQLcmd.ExecuteReader ' fill ComboBox with account numbers While DataReader.Read() cboAccountNumbers.Items.Add(DataReader("CardNumber")) End While 'Close the connection DataReader.Close() dbCon.Close() Catch ex As Exception 'Output error message to user with explaination of error MsgBox("Failure to communicate" & vbCrLf & vbCrLf & ex.Message) End Try End Sub ' invoke when user provides account number Private Sub RetrieveAccountInformation() ' specify account number of record from which data will be retrieved dbCon = New MySqlConnection("Server=localhost;Database=test;Uid=root;Pwd=mysql") strQuery = "SELECT Name, Balance, Password " & "FROM Account WHERE CardNumber='" & Val(cboAccountNumbers.Text) & "' " SQLcmd = New MySqlCommand(strQuery, dbCon) dbCon.Open() ' open database connection ' create database reader to read information from database DataReader = SQLcmd.ExecuteReader DataReader.Read() ' open data reader connection ' retrieve Password number, balance amount and name information from database m_strPass = Convert.ToString(DataReader("Password")) m_decBalance = Convert.ToString(DataReader("Balance")) m_strName = Convert.ToString(DataReader("Name")) DataReader.Close() ' close data reader connection dbCon.Close() ' close database connection End Sub ' RetrieveAccountInformation Private Sub btnBalance_Click(sender As Object, e As EventArgs) Handles btnBalance.Click 'Retrieve their account information RetrieveAccountInformation() Try MsgBox("You balance is " + " " + m_decBalance) Catch ex As Exception MsgBox(ex.Message) End Try End Sub End Class ```