c# - Exception: System.InvalidOperationException Trying to validate a login information -
i trying create login form. having problems database. have created windows form consists of user name , password, , login button. think statement :
dataadapterobject.fill(datatableobject)
has error. using visual studio profesional 2013 update 4 , sql server 2014 enterprise editon.
the code follows :
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.data.sqlclient; using system.drawing; using system.linq; using system.text; using system.threading.tasks; using system.windows.forms; namespace society_accounting_software { public partial class loginscreen : form { sqlconnection databaseconnect = new sqlconnection(); public loginscreen() { sqlconnection databaseconnect = new sqlconnection(); databaseconnect.connectionstring = "data source=gaurav-pc;initial catalog=societyaccountingdatabase;integrated security=true"; initializecomponent(); } private void label1_click(object sender, eventargs e) { } private void form1_load(object sender, eventargs e) { sqlconnection databaseconnect = new sqlconnection("data source=gaurav-pc;initial catalog=societyaccountingdatabase;integrated security=true"); databaseconnect.open(); } private void textbox1_textchanged(object sender, eventargs e) { } private void label2_click(object sender, eventargs e) { } private void textbox1_textchanged_1(object sender, eventargs e) { } private void button1_click(object sender, eventargs e) { string querystring = "select userid,userpassword useraccounts userid='gaurav' , userpassword='test123'"; sqlconnection databaseconnect = new sqlconnection(); databaseconnect.connectionstring = "data source=gaurav-pc;initial catalog=societyaccountingdatabase;integrated security=true"; databaseconnect.open(); string username = usernametextbox.text; string password = passwordtextbox.text; sqlcommand sqlcommandobject = new sqlcommand("select userid,userpassword useraccounts userid='"+username+"' , userpassword='"+password+"'"); sqldataadapter dataadapterobject = new sqldataadapter(sqlcommandobject); datatable datatableobject = new datatable(); dataadapterobject.fill(datatableobject); if (datatableobject.rows.count > 0) { messagebox.show("login sucessful"); adminconsoleform adminconsole= new adminconsoleform(); this.hide(); adminconsole.show(); } else { messagebox.show("invalid login name , password please try again!"); } databaseconnect.close(); //adminconsoleform adminconsole= new adminconsoleform(); //this.hide(); //adminconsole.show(); } } }
can 1 help?
wherever possible should using
database connections so.
using(var connection = new sqlconnection(connectionstring)) { connection.open(); //... }
at moment randomly creating connections in various methods ontop of having connection field, pretty confusing.
you should not concatenating sql , should use parameterised queries
using(var connection= new sqlconnection(connectionstring)) { connection.open(); var sql = @"select password users userid = @userid"; var command = new sqlcommand(sql, connection); command.parameters.add("@userid", sqldbtype.varchar); command.parameters["@userid"].value = username; // .... }
passwords should never stored plaintext , should not able query password 'directly'. simple method of securing passwords hash password random salt, storing salt along hash in database.
you don't need datatable
should have single row returned , datareader
enough in scenario.
using(var connection= new sqlconnection(connectionstring)) { connection.open(); var sql = @"select password, salt users userid = @userid"; var command = new sqlcommand(sql, connection); command.parameters.add("@userid", sqldbtype.varchar); command.parameters["@userid"].value = username; using(var reader = command.executereader()) { if (reader.read()) { var password = reader.getstring(0); var salt = reader.getstring(1); return checkpassword(password, salt, pwrdtextbox.text); } debug.writeline("the user {0} not exist", username); return false; } }
i recommend reading through article salted password hashing - doing right on codeproject.