[C#] PostgreSQL i niepoprawne wyświetlanie czasu z tabeli


(mateusz-1991) #1

Witam

 

Piszę sobie aplikację bazodanową w C# i przy wykorzystaniu drivera o nazwie Npgsql. Nie byłoby problemu, gdyby nie pewne różnice. A mianowicie. W pgAdmin III po wylistowaniu mojego harmonogramu otrzymuję takie wartości:

10;"2015-06-20";"10:30:00";1
11;"2015-06-20";"10:00:00";2

Gdy próbuję to samo zrobić z zastosowaniem Npgsql otrzymuję następujące wartości:

10;"2015-06-20";"0001-01-01 10:30";1
11;"2015-06-20";"0001-01-01 10:00";2

Kod z WindowsForms:

try
{
String host = [..]
string connstring = [...]

            NpgsqlConnection conn = new NpgsqlConnection(connstring);
            conn.Open();
            string sql = "SELECT * FROM harmonogram";
            NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
            ds.Reset();
            da.Fill(ds);
            dt = ds.Tables[0];
            dataGridView1.DataSource = dt;
            conn.Close();
        }
        catch (Exception msg){[...]}

Z samym połączeniem z bazą danych nie ma problemów. Problem jest tylko z wyświetleniem poprawnie dat.

 

Orientuje się ktoś z czego ów błąd wynika (różnica między wyświetlonym czasem w pgAdmin, a aplikacją WF)? Może powinienem zastosować inne polecenia?


(Zulowski) #2

Akurat kodu, który psuje nie podałeś.

twój GridView po prostu inaczej formatuje DateTime niż tego oczekujesz,

Nie wiem co masz w tym gridzie…

Ale poczytaj o “grid column repository” i “datetime format c#”

 

np

dataGridViewCellStyle.Format = "dd/MM/yyyy";
this.date.DefaultCellStyle = dataGridViewCellStyle;
// date being a System.Windows.Forms.DataGridViewTextBoxColumn

(mateusz-1991) #3

Problem rozwiązałem, acz może w niefachowy sposób. Zmieniłem typ w bazie danych PostgreSQL z Date na String. Wymagana funkcjonalność została, a to się liczy (sortowanie i wyszukiwanie). Niemniej dziękuję za pomoc.

 

@Zulowski

Datę sformatowałem na przytoczony przez Ciebie sposób, ale problemu dalej to nie rozwiązało.


(mr-owl) #4

Witam,

 

Mam wrażenie że w bazie przechowujesz osobno datę i osobno czas, C# nie posiada takiego typu danych. Dla twojego przypadku lepiej jest albo przechowywać dane jako typ timestamp albo podczas pobierania danych z bazy taki typ wygenerować. Dopiero podczas formatowania danych w DataGridView dla kolumn przygotowujesz oddzilne formatowanie, jeden dla samej daty a drugi dla samego czasu.

 

Pozdrawiam,

 

mr-owl