De fato, o ODBC tem sua parcela de problemas com o suporte a parâmetros nomeados. No entanto, é possível certo uso de parâmetros nomeados.
Por exemplo, no seu caso, a seguinte sintaxe funciona:
OdbcCommand cmd = sql.CreateCommand();
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = ?";
cmd.Parameters.Add("USER_ID", OdbcType.VarChar, 250).Value = email;
Situação mais complicada é quando você não tem uma correspondência exclusiva para o parâmetro como USER_ID =?; por exemplo, quando você quiser usar o IN operador em ONDE cláusula.
Então a seguinte sintaxe faria o trabalho:
OdbcCommand cmd = sql.CreateCommand();
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID IN (?, ?)";
cmd.Parameters.Add("?ID1", OdbcType.VarChar, 250).Value = email1;
cmd.Parameters.Add("?ID2", OdbcType.VarChar, 250).Value = email2;
Observe o uso de ? (ponto de interrogação) em vez de @ (arroba) dentro do nome do parâmetro. Embora note que a substituição dos valores dos parâmetros neste caso não tem nada a ver com seus nomes, mas apenas com sua ordem com a coleção de parâmetros.
Eu espero que isso ajude :-)