currval nie działa(?)

0

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

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