ASP.NET i Postgresql

0

Witam

Chciałbym w moim projekcie w asp.net dokonywać operacji na bazie postgresql.
Dołączyłem dataprovidera npgsql do projektu, operacje odcztu działają bez problemu, niestety nie potrafie dokonać zapisu lub uaktualnienia do bazy.Trzeba coś jeszcze ustawiać w projekcie?

0

a jakiś fragment kodu?

0

Masz PRIMARY KEY w tabelach?

0
 protected void Login1_Authenticate1(object sender, AuthenticateEventArgs e)
        {
            int liczba_logowan = 0;
            bool logon = false;
            conn = new NpgsqlConnection("Server='localhost';Port=5432;User Id=postgres;Password=12345;Database=db;");
            conn.Open();
            command = new NpgsqlCommand("SELECT * FROM account", conn);
            dr = command.ExecuteReader();
        
            while(dr.Read())
            {
                if ((dr["user"].ToString() == Login1.UserName) && (dr["password"].ToString() == Login1.Password))
                {

                    if (String.IsNullOrEmpty(dr["log"].ToString())) liczba_logowan = 0;
                    else liczba_logowan = Convert.ToInt32(dr["log"]);
                    logon = true;
                }
            }

            if (logon)
            {
                e.Authenticated = true;
               // command2 = new NpgsqlCommand("UPDATE  account SET log=" + (++liczba_logowan).ToString() + " WHERE user=" + dr["user"].ToString() + ")", conn);
                string insert="UPDATE  account SET log=" + (liczba_logowan++).ToString() + " WHERE user='"+Login1.UserName+"' ";
                command2 = new NpgsqlCommand(insert, conn);
               command2.ExecuteNonQuery
               
                conn.Close();
                Session["username"] = Login1.UserName;
                if (Session["username"].ToString() == "admin") Response.Redirect("~/WebForm3.aspx");
                else Response.Redirect("~/WebForm2.aspx");
            }
            else
            {
                conn.Close();
                e.Authenticated = false;
            }

        }
0
Marcin.Miga napisał(a):

Masz PRIMARY KEY w tabelach?

Mam

0
command2.ExecuteNonQuery

To Ci się w ogóle kompiluje?

0

Sprawdz w ogole z poziomu konsoli sql czy wygenerowane zapytanie przechowywane w stringu sie wykona

1
 
...
    string insert  ="UPDATE  account SET log=" + (liczba_logowan++).ToString() + " WHERE user='"+Login1.UserName+"' ";
                command2 = new NpgsqlCommand(insert, conn);
               command2.ExecuteNonQuery();
...
  1. czemu liczba logowań do string? czemu nie int?
  2. brakuje mi tu parameters wg mnie powinno to wyglądać mniej więcej
 
string liczba = (liczba_logowan++).ToString();
string insert ="UPDATE  account SET log=  @l_log WHERE user = @log";
command2 = new NpgsqlCommand(insert, conn);
command2.Parameters.AddWithValue("@l_log", liczba);
command2.Parameters.AddWithValue("@log", Login1.UserName);
command2.ExecuteNonQuery();

lub zapoznaj się

http://npgsql.projects.pgfoundry.org/exampleprograms.html

1
            command = new NpgsqlCommand("SELECT * FROM account", conn);
            dr = command.ExecuteReader();
        
            while(dr.Read())
            {
                if ((dr["user"].ToString() == Login1.UserName) && (dr["password"].ToString() == Login1.Password))
                {

                    if (String.IsNullOrEmpty(dr["log"].ToString())) liczba_logowan = 0;
                    else liczba_logowan = Convert.ToInt32(dr["log"]);
                    logon = true;
                }
            }

Sekwencyjnie czytasz wiersze z tabeli po to, aby znaleźć w nich pasujący rekord? Dlaczego nie użyjesz WHERE?
Pomijam już fakt, że przechowywanie hasła w bazie jako czysty napis jest po prostu niebezpieczne.

string insert="UPDATE  account SET log=" + (liczba_logowan++).ToString() + " WHERE user='"+Login1.UserName+"' ";

Skoro log jest typem napisowym, to pewno jego wartość trzeba podać w apostrofach, a Ty tego nie robisz.

0

Co zaobserwowałem:
W tabeli miałem kolumne "user" typu text. W oknie SQL (używam pgadmin3) gdzie jest tabela zapisana w sql "user" zrobiło się na różowo i doszły cudzysłowie.
Np. kolumne "password" też mam tpu text i nie ma koloru różowego i cudzysłowu.
Przerobiłem kolumne "user" na "userr" i tabela jest uaktualniana.Dlaczego tak się dzieje?
Pomiajając mankamenty w kodzie które wskazaliście.

1

Bo user to zapewne słowo kluczowe SQL, więc jeśli użyłeś takiej nazwy kolumny, to w zapytaniach powinieneś ją zapisywać jako coś w rodzaju [user], aby PostgreSQL wiedział, że chodzi o kolumnę, a nie o coś innego.

A tak w ogóle to to zapytanie powinno wyglądać jakoś tak:
string insert="UPDATE account SET log = log + 1 WHERE user='"+Login1.UserName+"' ";
Inkrementowanie licznika logowań po stronie aplikacji nie ma sensu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1