Cześć. Wykonuję INSERT do tabeli i chcę zdobyć ID tego rekordu.
Insert wykonuję w taki sposób:
private NpgsqlConnection Connection; //jest tworzone w konstruktorze
private NpgsqlCommand Command = new NpgsqlCommand(); //w konstruktorze przypisuję mu Connection
public bool ExecuteQuery(string query, NpgsqlConnection conn = null, bool MessageOnError = true)
{
if (conn == null) conn = Connection;
Command.Connection = conn;
Command.CommandType = CommandType.Text;
Command.CommandText = query;
Command.ExecuteNonQuery();
return true;
//tu jest jeszcze blok try..catch, ale nie napisałem ze względu na czytelność
}
I teraz chcę pobrać wartość zainsertowanego rekordu. Używam w tym celu currval:
SELECT currval('tabela_id_seq')
No i dostaję komunikat: "currval sekwencji "tabela_id_seq" nie jest jeszcze zdefiniowana w tej sesji".
currval pobieram tak:
public object ExecuteQueryWithVal(string query, NpgsqlConnection conn = null, bool MessageOnError = true)
{
if (conn == null) conn = Connection;
Command.Connection = conn;
Command.CommandType = CommandType.Text;
Command.CommandText = query;
return Command.ExecuteScalar();
}
public int getLastInsertID(string tableName, string pkName)
{
string query = String.Format("SELECT currval(pg_get_serial_sequence('{0}','{1}'))", tableName, pkName);
return (int)ExecuteQueryWithVal(query);
}
Czemu tak się dzieje? Nigdzie się z bazą nie rozłączam przecież. Operacje wykonuje na jedenej i tej samej instancji klasy. Z queryTool pgAdmina oczywiście wszystko jest OK.
Rekord jest do tabeli dodany.
[ODP]
OK, można usunąć do kosza. Problem był po stronie kodu C#.
Nauczyłem się, że nie można rzutować obiektu na int: (int)obj
należy posłużyć się metodą z klasy Convert