[Q] Kan inte hämta data från postgresql med C#

Permalänk
Medlem

[Q] Kan inte hämta data från postgresql med C#

Tjenare.

Databasstruktur:
Firstname: character varying(30); not null; format: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; exempel: Fredrik, Muhammed, Lee, Joey
ID: integer; not null; nextval('"member_golf_ID_seq"'::regclass); minimilängt: 9, format: XXXXXXXXX; exempel: 012345678
Password: character varying; not null; length: 15; minimumlength: 6; format: XXXXXX; exempel: WioIJ4

Kod för att hämta förnamnet:

public bool CheckIfUserExist(int username, string password) { try { conn = new NpgsqlConnection(connString); cmd = new NpgsqlCommand("SELECT first_name FROM member WHERE golf_id = :valuea AND password = :valueb", conn); cmd.Parameters.Add(":valuea", NpgsqlDbType.Integer); cmd.Parameters.Add(":valueb", NpgsqlDbType.Varchar); cmd.Parameters[0].Value = username; cmd.Parameters[1].Value = password; conn.Open(); object found = cmd.ExecuteScalar(); conn.Close(); if (Convert.ToInt16(found.ToString()) >= 0) { return true; } else { return false; } } catch (Exception) { return false; } }

Konstigt nog funkar det att genom andra funktioner byta lösenord på detta id så det existerar iaf.
Vad har jag gjort fel?

Den godkänner en query mot ett id: 92 men inte andra som är högre.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem

du verkar ju vilja konvertera "first_name" till en int.
är det inte en sträng?

EDIT: och vad säger debuggern?

Edit2 (Off Topic):
var deklarerar du conn någonstans? kör du dispose på det tidigare objektet innan du skapar ett nytt i funktionen?
har påpekat det innan, men using är en väldigt bra uppfinning i detta fall.

Testa om följande funkar:
(tog bort password-parametern då funktionen, enligt namnet iaf, bara ska kontrollera om användaren finns... (vilket iofs bygger på antagandet att first_name egentligen är user_name, som parameternamnet antyder.))

public bool CheckIfUserExist(string username) { using (var connection = new NpgsqlConnection(connString)) using (var command = new NpgsqlCommand("SELECT golf_id FROM member WHERE first_name = :valuea", connection)) { command.Parameters.Add(":valuea", NpgsqlDbType.Varchar, 30).Value = username; command.Connection.Open(); // Inga problem att returnera här, då using kör conn.Dispose() som i sin tur kör conn.Close() return (int?)command.ExecuteScalar() >= 0; } }

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

du verkar ju vilja konvertera "first_name" till en int.

Jag använder cirka 10-40 olika sqlsyntaxer och har definierat conn som en NpgsqlConnection längst upp i klassen.
connString detsamma och varje syntax instansierar en ny med en dispose.

Ska kika om koden kmr funka eller inte. Lösen är viktigt.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Jag använder cirka 10-40 olika sqlsyntaxer och har definierat conn som en NpgsqlConnection längst upp i klassen.
connString detsamma och varje syntax instansierar en ny med en dispose.

om du ändå kör conn = new NpgsqlConnection() i alla dina funktioner, så är det ju ingen mening att ha den som en klass-variabel, eftersom du ändå verkar skapa nya objekt hela tiden. (antagande baserat på koden du postat.)
jag röstar fortfarande på using !

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

om du ändå kör conn = new NpgsqlConnection() i alla dina funktioner, så är det ju ingen mening att ha den som en klass-variabel, eftersom du ändå verkar skapa nya objekt hela tiden. (antagande baserat på koden du postat.)
jag röstar fortfarande på using !

Jo det förstås.

Koden funkar ju konstigt nog för att hitta en användare och byta dess lösenord med den här koden:

public bool SetNewPassword(int username, string password, string newPassword) { using (var connection = new NpgsqlConnection(connString)) using (var cmds = new NpgsqlCommand("UPDATE member SET password = :valuea WHERE golfid = :valueb AND password = :valuec;", connection)) { cmds.Parameters.Add(":valuea", NpgsqlDbType.Varchar); cmds.Parameters.Add(":valueb", NpgsqlDbType.Varchar); cmds.Parameters.Add(":valuec", NpgsqlDbType.Varchar); cmds.Parameters[0].Value = newPassword; cmds.Parameters[1].Value = username; cmds.Parameters[2].Value = password; if (connection.State != ConnectionState.Open) { connection.Open(); } int rowsAffected = cmds.ExecuteNonQuery(); if (rowsAffected > 0) { return true; } else { return false; } } }

Men den här (nya) för att logga in funkar ännu inte.

public bool CheckIfUserExist(string username, string password) { try { using (var connection = new NpgsqlConnection(connString)) using (var cmds = new NpgsqlCommand("SELECT first_name FROM member WHERE golfid = :valuea AND password = :valueb", connection)) { cmds.Parameters.Add(":valuea", NpgsqlDbType.Varchar, 30).Value = username; cmds.Parameters.Add(":valueb", NpgsqlDbType.Varchar, 15).Value = password; connection.Open(); object found = cmds.ExecuteScalar(); if (found.ToString().Length >= 9) { return true; } else { return false; } } } catch (Exception) { return false; } }

Ändrade i databasen temporärt till en varchar för att se om det hjälpte istället för att ha en integer för golfid't. Kommer dock vara integer när det väl är klart.

Q kör en using dispose automatiskt på sig själv när den är klar?

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem

nu vet jag inte riktigt hur du lagt upp det hela, men det ser ju ut som att man loggar in genom att ange sitt användar-id och lösenord. stämmer det?

du skulle ju kunna köra en Count(*) för att se hur många rader som matchar parametrarna du anger.

ex (som använder first_name och inte golf_id. ändra om jag missuppfattat ditt upplägg):

public bool CheckIfUserExist(string username, string password) { const string sql = "SELECT COUNT(*) FROM member WHERE first_name = :valuea AND password = :valueb"; using (var connection = new NpgsqlConnection(connString)) using (var command = new NpgsqlCommand(sql, connection)) { command.Parameters.Add(":valuea", NpgsqlDbType.Varchar, 30).Value = username; command.Parameters.Add(":valueb", NpgsqlDbType.Varchar, 15).Value = password; command.Connection.Open(); return (int)command.ExecuteScalar() == 1; // Observera att detta returnerar false om det är flera användare med samma first_name och password. } }

Ang using:
Kompilatorn omvandlar using till lite annan kod kan man säga.

// detta... using (var connection = new NpgsqlConnection(connString)) { // Do Stuff... } // blir typ detta... { NpgsqlConnection connection = null; try { connection = new NpgsqlConnection(connString); // Do Stuff... } finally { connection.Dispose(); // som internt kör connection.Close() om det behövs. } } // här är connection utanför scope och "finns" inte längre och Dispose() har körts.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

nu vet jag inte riktigt hur du lagt upp det hela, men det ser ju ut som att man loggar in genom att ange sitt användar-id och lösenord. stämmer det?

du skulle ju kunna köra en Count(*) för att se hur många rader som matchar parametrarna du anger.

ex (som använder first_name och inte golf_id. ändra om jag missuppfattat ditt upplägg):

public bool CheckIfUserExist(string username, string password) { const string sql = "SELECT COUNT(*) FROM member WHERE first_name = :valuea AND password = :valueb"; using (var connection = new NpgsqlConnection(connString)) using (var command = new NpgsqlCommand(sql, connection)) { command.Parameters.Add(":valuea", NpgsqlDbType.Varchar, 30).Value = username; command.Parameters.Add(":valueb", NpgsqlDbType.Varchar, 15).Value = password; command.Connection.Open(); return (int)command.ExecuteScalar() == 1; // Observera att detta returnerar false om det är flera användare med samma first_name och password. } }

Ang using:
Kompilatorn omvandlar using till lite annan kod kan man säga.

// detta... using (var connection = new NpgsqlConnection(connString)) { // Do Stuff... } // blir typ detta... { NpgsqlConnection connection = null; try { connection = new NpgsqlConnection(connString); // Do Stuff... } finally { connection.Dispose(); // som internt kör connection.Close() om det behövs. } } // här är connection utanför scope och "finns" inte längre och Dispose() har körts.

Den påstår sig att omvandlingen inte är giltig eller att omvandling inte gick. Då på värdet username som är exempelvis: 921015-0001
Den kör mot en Character Varying.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Den påstår sig att omvandlingen inte är giltig eller att omvandling inte gick. Då på värdet username som är exempelvis: 921015-0001
Den kör mot en Character Varying.

hur ser din tabell ut?
hur ser frågan ut?
hur ser felmeddelandet ut?

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

hur ser din tabell ut?
hur ser frågan ut?
hur ser felmeddelandet ut?

Kodblock

public bool CheckIfUserExist(string username, string password) { using (var connection = new NpgsqlConnection(connString)) using (var command = new NpgsqlCommand("SELECT COUNT(*) FROM member WHERE golfid = :valuea AND password = :valueb", connection)) { command.Parameters.Add(":valuea", NpgsqlDbType.Varchar, 10).Value = username; command.Parameters.Add(":valueb", NpgsqlDbType.Varchar, 15).Value = password; command.Connection.Open(); return (int)command.ExecuteScalar() == 1; } }

Dold text

Syntax

"SELECT COUNT(*) FROM member WHERE golfid = :valuea AND password = :valueb"

Syntax exempel: "SELECT COUNT(*) FROM member WHERE golfid = 1514029423 AND password = test1234";

Felmeddelande
"Den angivna omvandlingen är inte giltig" - Error ges på "return (int)command.ExecuteScalar() == 1;

Databasstruktur

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem

testa att byta (int) mot (long). PostgreSQLs count returnerar tydligen en bigint.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

testa att byta (int) mot (long). PostgreSQLs count returnerar tydligen en bigint.

Ska kika på det när jag kommer hem från jobbet.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem
Skrivet av jovnas:

testa att byta (int) mot (long). PostgreSQLs count returnerar tydligen en bigint.

Funkade inte. Nu ger han ingen error men säger istället att objektet i databasen inte existerar.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40