Dariusz Bujak

Dariusz Bujak Student, młodszy
programista JAVA,
C++

Temat: C++/CLI i potgreSQL

Witam

Stawiam pierwsze kroki w połączeniu C++/CLI i potgreSQL, udało mi sie dodać rekord do bazy tylko że teraz potrzebował bym jego id, użyłem takiego kodu


void AddWithDataSet(NpgsqlConnection conn)
{ conn.Open();
DataSet ds = new DataSet();

NpgsqlDataAdapter da = new NpgsqlDataAdapter("select * from tableb", conn);
da.InsertCommand = new NpgsqlCommand("insert into tableb(field_int2, field_timestamp, field_numeric) " +
" values (:a, :b, :c)", conn);
da.InsertCommand.Parameters.Add(new NpgsqlParameter("a", NpgsqlDbType.Smallint));
da.InsertCommand.Parameters.Add(new NpgsqlParameter("b", NpgsqlDbType.Timestamp));
da.InsertCommand.Parameters.Add(new NpgsqlParameter("c", NpgsqlDbType.Numeric));
da.InsertCommand.Parameters[0].Direction = ParameterDirection.Input;
da.InsertCommand.Parameters[1].Direction = ParameterDirection.Input;
da.InsertCommand.Parameters[2].Direction = ParameterDirection.Input;
da.InsertCommand.Parameters[0].SourceColumn = "field_int2";
da.InsertCommand.Parameters[1].SourceColumn = "field_timestamp";
da.InsertCommand.Parameters[2].SourceColumn = "field_numeric";
da.Fill(ds);
DataTable dt = ds.Tables[0];
DataRow dr = dt.NewRow();
dr["field_int2"] = 4;
dr["field_timestamp"] = new DateTime(2003, 03, 03, 14, 0, 0);
dr["field_numeric"] = 7.3M;
dt.Rows.Add(dr);
DataSet ds2 = ds.GetChanges();
da.Update(ds2);
ds.Merge(ds2);
ds.AcceptChanges();
}


jest to w sumie przykład z tej strony:
http://npgsql.projects.postgresql.org/docs/manual/User...

Gdy by ktoś znał inny sposób dodawania do bazy to też prosze po wpis, ale najważniejsze jest dla mnie teraz pobranie tego id.

Przy okazji prosiłbym o podanie jak pobrać aktualną date ponieważ mam kolumne 'update_date' do której chciałbym wprowadzać wartość po każdej modyfikacji rekordu, typ rekordu to 'timestamp without time zone'.

Pozdrawiam.Dariusz Bujak edytował(a) ten post dnia 10.05.12 o godzinie 12:43

konto usunięte

Temat: C++/CLI i potgreSQL

Czy tabela, do której dodajesz rekord ma klucz główny w formie autoinkrementacji (w Postgre chyba pole typu serial) ? Jezeli tak, to po dodaniu rekordu możesz pobrać maksymalne ID z danej tablicy i to będzie ID rekordu, który wrzuciłeś. To mało eleganckie rozwiązanie i bardzo niebezpieczne, gdy do tej tabeli moga jednoczesnie dane wpisywac rózni klienci/wątki. Jeżeli nie i tylko Ty wpisujesz tam dane, to proponuje właśnie z tego skorzystać.

Nie wiem czy w CLI jest Entity Framework - jeżeli tak, to proponuje przerzucić się właśnie na EF z wykorzystaniem linq.
Dariusz Bujak

Dariusz Bujak Student, młodszy
programista JAVA,
C++

Temat: C++/CLI i potgreSQL

Dzięki za podpowiedz, ale faktycznie to niezbyt bezpieczny pomysł bo właśnie na tej tabeli może pracować jednocześnie więcej osób. W sumie to rozwiązałem ten problem najpierw z sekwencji pobierając id i potem je insertować do tabeli, ale jest to rozwiązanie o tyle niewygodne że w przypadku błędu w dodaniu sekwencja sie zwiększyła a rekordu nie udało mi sie dodać. Dlatego prosze jeszcze o jakieś pomysły.

PozdrawiamDariusz Bujak edytował(a) ten post dnia 07.06.12 o godzinie 09:16

konto usunięte

Temat: C++/CLI i potgreSQL

Mam! :) Proste, nie wiem czemu mi ucieklo :)

Procedura skladowana na serwerze postgre. Czyli implementujesz na serwerze postgre procedure skladowana, ktorej zadaniem jest dodanie rekordu (w parametrach podajesz dane nowego rekordu), a w wartosci zwracanej procedury (mam nadzieje, ze Postgre to obsluguje.. MS tak) otrzymujesz ID nowo dodanego rekordu. Dodanie nowego rekordu w procedurze opakuj w transakcje - jezeli cos pojdzie nie tak, to zwracasz -1, co jest dla Ciebie informacja, ze rekord nie zostal dodany. Mysle, ze to jest najlepsze rozwiazanie
Dariusz Bujak

Dariusz Bujak Student, młodszy
programista JAVA,
C++

Temat: C++/CLI i potgreSQL

Ok dzięki pogooglam za tym tropem:) pozdrawiam

Następna dyskusja:

C++/CLI. Kto jeszcze progra...




Wyślij zaproszenie do