De acordo com o MSDN.
http ://msdn.microsoft.com/en-us/library/system.data.odbc.odbccommand.parameters.aspx
Quando CommandType é definido como Text, o .NET Framework Data Provider para ODBC não oferece suporte à passagem de parâmetros nomeados para uma instrução SQL ou para um procedimento armazenado chamado por um OdbcCommand. Em qualquer um desses casos, use o espaço reservado de ponto de interrogação (?).
Portanto, sua consulta deve ser:
string sql = "insert into klant (firstname) values (?)"
Se você tiver vários parâmetros, eles serão definidos na ordem em que você os adicionar.
Além disso, acho que a linha
string firstname = txtfirstname.ToString();
deve ler
string firstname = txtfirstname.Text();
Mas não é isso que está causando seu problema imediato.