Zamiana timestamp na stringa


(northwest) #1

Witam,

próbuje pobrać z bazy i wyświetlić na listboxie pole które jest timestampem. Mam taki kod:

IDbConnection dbcon;

                dbcon = new NpgsqlConnection(BazaZmiennych.GetSettings().connectionString);

                dbcon.Open();

                IDbCommand dbcmd = dbcon.CreateCommand();

                string sql = "Select idcudaka, czas, status, id, command, odpowiedz FROM server_commands";

                dbcmd.CommandText = sql;

                IDataReader reader = dbcmd.ExecuteReader();

                listView1.View = View.Details;

                ListViewItem lSingleItem;

                listView1.Items.Clear();

                while (reader.Read())

                {

                    lSingleItem = listView1.Items.Add(reader["id"].ToString());

                    int idcudaka = (int)reader["idcudaka"];

                    lSingleItem.SubItems.Add(idcudaka.ToString());

                    int data = (int)reader["czas"]; 

                    lSingleItem.SubItems.Add(data.ToString());

                    lSingleItem.SubItems.Add((string)reader["status"]);

                    lSingleItem.SubItems.Add((string)reader["command"]);

                    lSingleItem.SubItems.Add((string)reader["odpowiedz"]);

                }

                reader.Close();

                reader = null;

                dbcmd.Dispose();

                dbcmd = null;

                dbcon.Close();

                dbcon = null;

Zamiana którą mam : int data = (int)reader["czas"];

zwraca błąd: Określone rzutowanie jest nieprawidłowe.

Wiecie może jak zrobić z tego stringa??

Z góry dzięki za pomoc,

pozdrawiam Northwest


(Fiołek) #2

Typ TimeStamp(czy jak się tak nazywa) udostępnia funkcję ToString(jak każdy obiekt).


(system) #3

TimeStamp to właściwie napis, data i czas bez spacji kropek i dwukropków, same cyfry, ale jest zbyt długi jak na int.


(northwest) #4

chyba jednak nie :confused: dałem: Int32 data = (Int32)reader["czas"]; i ten sam problem...

string data = Convert.ToBase64String(reader["czas"]); - kombinuje z czymś takim, ale to chyba błędna droga??


(Fiołek) #5

Może sprawdź jaki to typ a nie "robisz tak na pałę"? Sprawdź tak:

Type t = reader["czas"].GetType();

//Sprawdzasz albo debuggerem, albo wypisujesz sobie gdzieś t.Name

Jeśli już będziesz miał typ, to bez problemu będziesz wiedział jak to zrobić.


(northwest) #6

ten kod który podałeś zwraca t=null...


(system) #7

reader jest klasą może sobie interpretować ten ciąg znaków jak programiście się zechciało, jeżeli nie chce konwertować na int64 to sprawdź czy konwertuje na double jeżeli tak to pewnie to typ datetime.


(northwest) #8

nie chce działać...:frowning:


(system) #9

Spróbuj to, jedno z dwóch powinno zadziałać:

DateTime dt = reader.GetDateTime(1);

TimeSpan ts = reader.GetTimeSpan(1);

(northwest) #10

zrobiłem taką kombinację:

DateTime dt = reader.GetDateTime(1);

lSingleItem.SubItems.Add(dt.ToString());

i działa, dzięki WIELKIE :))

ps. żeby określić dzień wcześniejszy niż ten pobrany z bazy (czyli np: 2008-10-10 12:50:01 pobrałem z bazy)

co trzeba zrobić??:slight_smile: coś w stylu dt= dt - 1 ??


(system) #11

Dokladnie, analogicznie aby odjąć 1 sek trzeba zrobić dt= dt - 1/24/60/60;


(northwest) #12

Error 1 Operator '-' cannot be applied to operands of type 'System.DateTime' and 'int' chyba nie do końca tak można :confused:


(Airborn) #13
dt.AddDays(-1.0)