Avatar billede strikerdk Novice
14. november 2008 - 16:17 Der er 6 kommentarer og
1 løsning

Validering imod database

Jeg har en webapplikation, hvor et login skal validere op imod en access database. Jeg har forsøgt mig lidt frem, og har fundet frem til nedenstående - men jeg får desværre denne fejl:

*****************************************************************
Specified cast is not valid.

Line 64:                  while (readData.Read())
Line 65:                  {
Line 66:                      tempUid = readData.GetString(0);
Line 67:                      tempPwd = readData.GetString(1);
Line 68:                  }

Den er gal med linie 66 & 67 - men jeg kan ikke gennemskue den da det er en string der returneres. (Det burde det være i hvert fald)
*****************************************************************

Kode her:

protected void btnValidateUser_Click(object sender, EventArgs e)
    {
        bool IsValidUser = false;

        IsValidUser = ChechIfUserExist(Brugernavn.Text, Passkode.Text);

        if (IsValidUser)
        {
            fejl.Text = "Du er logget ind!";
            //Procced to next level
        }

        else
        {
            fejl.Text = "Du er IKKE logget ind!";
            //Abort or re-enter username and password
        }


    }

    protected static bool ChechIfUserExist(string ReadBrugernavn, string ReadPasskode)
    {
        string DBConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|eksempel.mdb;User Id=;Password=";
       
        string strSQL = "SELECT count(*) FROM BrugerTabel WHERE Brugernavn = @strBrugernavn AND Passkode = @strPasskode";

        string tempUid = null, tempPwd = null;

        using (OleDbConnection conn = new OleDbConnection(DBConnection))
        {
            using (OleDbCommand oledbcmd = new OleDbCommand(strSQL, conn))
            {
                conn.Open();

                oledbcmd.Parameters.Add(new OleDbParameter("@Uid", ReadBrugernavn));
                oledbcmd.Parameters.Add(new OleDbParameter("@Pwd", ReadPasskode));
                OleDbDataReader readData = oledbcmd.ExecuteReader();

                while (readData.Read())
                {
                    tempUid = readData.GetString(0);
                    tempPwd = readData.GetString(1);
                }
                readData.Close();
                conn.Close();
            }
        }
        if (!string.IsNullOrEmpty(tempUid) && (!string.IsNullOrEmpty(tempPwd)))
        {
            return true; //Valid User           
        }
        else
        {
            return false;//Invalid User
        }
    }
Avatar billede aaberg Nybegynder
14. november 2008 - 18:05 #1
Hvis du er i tvivl om hvilken datatype der bliver returneret, så prøv at skriv

object o = readData.GetValue(0);

Sæt et breakpoint på linjen, og lad debuggeren fortælle dig hvilken datatype der ligger i variablen o.
Avatar billede strikerdk Novice
14. november 2008 - 19:30 #2
Beskeden jeg får er:

Name: 0
Value: Null
Type: Object

Jeg kan desværre ikke rigtigt gennemskue hvad jeg bør stille op her :-(
Avatar billede strikerdk Novice
14. november 2008 - 19:32 #3
Og valuen bør jo ikke være Null hvis der er indtastet en tekst i Brugernavn og Pasword - bør den ikke indeholde en string?
Avatar billede aaberg Nybegynder
14. november 2008 - 20:26 #4
AAhh, nu kan jeg se hvad du gør forkert!!

Din sql sætning returnere bare 1 række med 1 kolonne som er en integer. Du skriver jo select count(*) .... i din sql! Du tæller antallet af rows i databasen, hvor brugernavn og password er lig med de givne brugernavn og password.

Prøv noget lignende dette (ikke testet)

protected static bool ChechIfUserExist(string ReadBrugernavn, string ReadPasskode)
    {
        string DBConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|eksempel.mdb;User Id=;Password=";
     
        string strSQL = "SELECT count(*) FROM BrugerTabel WHERE Brugernavn = @strBrugernavn AND Passkode = @strPasskode";

        int count = 0;

        using (OleDbConnection conn = new OleDbConnection(DBConnection))
        {
            using (OleDbCommand oledbcmd = new OleDbCommand(strSQL, conn))
            {
                conn.Open();

                oledbcmd.Parameters.Add(new OleDbParameter("@Uid", ReadBrugernavn));
                oledbcmd.Parameters.Add(new OleDbParameter("@Pwd", ReadPasskode));
               
                count = (int)oledbcms.ExecuteScalar();

                conn.Close();
            }
        }
        if (count == 1)
        {
            return true; //Valid User         
        }
        else
        {
            return false;//Invalid User
        }
    }
Avatar billede strikerdk Novice
15. november 2008 - 10:14 #5
Ahh - og en anden ting er, at jeg ikke får hentet parameterne ned fra strSQL. En lille rettelse.... :-)

Men ja nu virker det bare fornemt. Jeg rodede lidt med den boolean i aftes. Når man nu får et resultat - true or false, kan du så give et hint til hvordan jeg sender brugeren videre? Jeg kan jo ikke smide noget direkte ind i :

if (count == 1)
        {
            return true; //Valid User         
        }
        else
        {
            return false;//Invalid User
        }



Jeg smider lige koden med rettelserne her. :-)

Smider du et svar aaberg cc? Og tusind tak for hjælpen.
protected void btnValidateUser_Click(object sender, EventArgs e)
    {
        bool IsValidUser = false;
        IsValidUser = ChechIfUserExist(Brugernavn.Text, Passkode.Text);

        if (IsValidUser)
        {
            fejl.Text = "Du er logget ind!";
            //Procced to next level
        }

        else
        {
            fejl.Text = "Du er IKKE logget ind!";
            //Abort or re-enter username and password
        }
    }

    protected static bool ChechIfUserExist(string ReadBrugernavn, string ReadPasskode)
    {
        string DBConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|KoordinatorDB.mdb;User Id=;Password=";
       
        string strSQL = "SELECT count(*) FROM BrugerTabel WHERE Brugernavn = @strBrugernavn AND Passkode = @strPasskode";

        //string tempUid = null, tempPwd = null;
        int count = 0;

        using (OleDbConnection conn = new OleDbConnection(DBConnection))
        {
            using (OleDbCommand oledbcmd = new OleDbCommand(strSQL, conn))
            {
                conn.Open();

                oledbcmd.Parameters.Add(new OleDbParameter("@strBrugernavn", ReadBrugernavn));
                oledbcmd.Parameters.Add(new OleDbParameter("@strPasskode", ReadPasskode));                               
                //OleDbDataReader readData = oledbcmd.ExecuteReader();
                count = (int)oledbcmd.ExecuteScalar();

                //while (readData.Read())
                //{
                //    //object o = readData.GetValue(0);
                //    tempUid = readData.GetString(0);
                //    tempPwd = readData.GetString(1);
                //}
                //readData.Close();
                conn.Close();
            }
        }
       
        if (count == 1)
        {
            return true; //Valid User 

        }

        else
        {
            return false;//Invalid User
        }
    }
}
Avatar billede strikerdk Novice
15. november 2008 - 11:23 #6
Ahh ja selvf. Det skal jo være en del af btnValidateUser_Click

Smider du et svar aaberg? :-)
Avatar billede aaberg Nybegynder
15. november 2008 - 16:39 #7
Det var godt du fandt ud af det. her kommer svaret.

Lige en lille tilføjelse, som egentlig ikke har nogen praktisk betydning. Men, følgende:

if (count == 1)
{
    return true; //Valid User       
}
else
{
    return false;//Invalid User
}

kan skiftes ud med dette:

return count == 1;

Hvilket ser lidt mere elegant ud, men giver helt samme resultat.

:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester