pues de una forma sencillita seria algo como esto:
creo una conexion OLEDB hacia la base de datos
uso un OLEDBCOMMAND para el comando "SELECT * FROM usuarios WHERE usuario = '" + txtUsuario.text + "' and password = '"+txtPassword.text +"'" con la conexion que creamos anteriormente
creamos un OLEDBDATAREADER === OledbDataReader lector; <- va sin new
yo siempre inicio un try-catch-finally para que si ocurre un error no me termine la aplicacion
dentro del try
conexion.open
lector=comando.executereader
if (lector.hasrows) //esto es si encontro algun campo
{//si lo encontro que te mande al otro form
conexion.close //te desagradaria que te mande error aqui, te lo digo por experiencia
FormX forma = new FormX();
forma.show() o forma.showmodal()
}
else
{
messagebox.show("jajaja aqui no hay nadie registrado"...)
}
}
catch (error variable)//si hay error pues que te mande ese error
{
mensaje.show(variable.Message);
}
finally //para que un finali, solo para que cierre la conexion, o que la cierre antes de llamar al otro form
{
if(conexion != null)
{
conexion.close;
}
}
y pues eso seria la forma mas sencilla otra seria con datasets pero a mi me fastidian esos objetos asi que por mi punto de vista no te los recomiendo, aunque son buenos, por que yo los uso para CR
y otra forma seria con parameters los cuales se especifican de otra forma y con mas lineas, con los parameter tienes otra ventaja ya que puedes definir los tipos especificos y no los dejas al tanteo, y aguas con el SQL INJECT, te recomiendo una leida a eso por que asi me han tronado mis aplicaciones jejeje que chafa soy, espero te haya ayudado. saludos