Click here to Skip to main content
15,611,312 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
Imports MySql.Data.MySqlClient
Imports Microsoft.VisualBasic.ApplicationServices
Imports Microsoft.Win32


Public Class Form3

    Dim sqlconnector As New MySqlConnection
    Dim sqlcmd As New MySqlCommand
    Dim sqlRd As MySqlDataReader
    Dim sqldata As New DataTable
    Dim data As New MySqlDataAdapter

    Dim server As String = "localhost"
    Dim username As String = "SimamkeleXipu"
    Dim password As String = "0724067256sim"
    Dim database As String = "com scie project"
    Dim sqlQuery As String

    Private bitmark As Bitmap

    Private Sub UpdateTable()

        sqlconnector.ConnectionString = "server=" + server + ";" + " user id =" + username + ";" _
      + "password = " + password + ";" + "database =" + database

        sqlconnector.Open()
        sqlcmd.Connection = sqlconnector
        sqlcmd.CommandText = "SELECT * From com scie project.new_table"

        sqlRd = sqlcmd.ExecuteReader
        sqldata.Load(sqlRd)
        sqlRd.Close()
        sqlconnector.Close()


What I have tried:

I tried to recompile and re debug but nothing seems to work for me at this moment the bug I thing is on SqlRd=Sqlcmd.executeReader I tried to change this syntax but nothing still worked for me
Posted
Updated 17-Jan-21 10:04am
Comments
Richard Deeming 18-Jan-21 5:57am    
Don't store connections, commands, or data readers as class-level fields. Create them as local variables at the point where they're needed, and wrap them in Using blocks to ensure they're cleaned up as soon as they're no longer needed.

Using Statement - Visual Basic | Microsoft Docs[^]

1 solution

This is one of the most common problems we get asked, and it's also the one we are least equipped to answer, but you are most equipped to answer yourself.

Let me just explain what the error means: You have tried to use a variable, property, or a method return value but it contains null - which means that there is no instance of a class in the variable.
It's a bit like a pocket: you have a pocket in your shirt, which you use to hold a pen. If you reach into the pocket and find there isn't a pen there, you can't sign your name on a piece of paper - and you will get very funny looks if you try! The empty pocket is giving you a null value (no pen here!) so you can't do anything that you would normally do once you retrieved your pen. Why is it empty? That's the question - it may be that you forgot to pick up your pen when you left the house this morning, or possibly you left the pen in the pocket of yesterday's shirt when you took it off last night.

We can't tell, because we weren't there, and even more importantly, we can't even see your shirt, much less what is in the pocket!

Back to computers, and you have done the same thing, somehow - and we can't see your code, much less run it and find out what contains null when it shouldn't.
But you can - and Visual Studio will help you here. Run your program in the debugger and when it fails, VS will show you the line it found the problem on. You can then start looking at the various parts of it to see what value is null and start looking back through your code to find out why. So put a breakpoint at the beginning of the method containing the error line, and run your program from the start again. This time, VS will stop before the error, and let you examine what is going on by stepping through the code looking at your values.

But we can't do that - we don't have your code, we don't know how to use it if we did have it, we don't have your data. So try it - and see how much information you can find out!

But there are two other things you really need to look at:
1) Never concatenate strings to build a SQL command. It leaves you wide open to accidental or deliberate SQL Injection attack which can destroy your entire database. Always use Parameterized queries instead.

When you concatenate strings, you cause problems because SQL receives commands like:
SQL
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
The quote the user added terminates the string as far as SQL is concerned and you get problems. But it could be worse. If I come along and type this instead: "x';DROP TABLE MyTable;--" Then SQL receives a very different command:
SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Which SQL sees as three separate commands:
SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';
A perfectly valid SELECT
SQL
DROP TABLE MyTable;
A perfectly valid "delete the table" command
SQL
--'
And everything else is a comment.
So it does: selects any matching rows, deletes the table from the DB, and ignores anything else.

So ALWAYS use parameterized queries! Or be prepared to restore your DB from backup frequently. You do take backups regularly, don't you?

2) Never store passwords in clear text - it is a major security risk. There is some information on how to do it here: Password Storage: How to do it.[^]

And remember: if you have any European Union users then GDPR applies and that means you need to handle passwords as sensitive data and store them in a safe and secure manner. Text is neither of those and the fines can be .... um ... outstanding. In December 2018 a German company received a relatively low fine of €20,000 for just that.
 
Share this answer
 
Comments
Richard Deeming 18-Jan-21 5:58am    
I can't see any string concatenation to build the command, only the connection string. And the only mention of the password is also in the connection string. :)

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900