Thanks for the relevant links everyone, I'll read those as soon as I can.
I'm not really having trouble with getting the code to work but I'm just interested in how
others might do the same thing, I want to see the advantages and problems in my own
thinking, and maybe learn something I didn't know.
Here's an example of what I did, forgive the horrible VB.NET, I'm learning the language as I go.
The way I finally settled on implementing it was by placing this object between the database and all the other classes. It speaks SQL to the database, but it communicates with everyone else through DataSet objects. This way, if a class wants to modify the database, it can create a DataSet object and pass it to the appropriate function in the singleton.
I got this idea by reading about
Data Access Objects. (I'm not one of those Design Pattern obsessed programmers, I promise, I've just been reading about all these techniques recently :p).
The negative thing I see about this is that my object must either support every possible specific database usage a class might want, or it must be so generic that it can support any database interaction no matter what (I don't know how to do that :p).
So I ended up with a singleton, not so bad but I'll definitely try it another way next time.