O que faço em meus programas é o seguinte (obs.: em ACCESS x VB, mas a lógica é a mesma em outros bancos, muda alguns comandos)
quando o usuario clica no botão novo eu já gravo o próximo código no banco de dados, encontrado com um select
SELECT (MAX(idCodigo) + 1) as Proximo FROM Clientes
Se o usuario clicar em cancelar eu excluo o registro. se ele clicar em Salvar, salvo os outros dados da Tabela, já que o código já foi salvo.
Pode ser que se o programa estiver em rede, algum registro pule, mas essa foi a maneira + segura que encontrei. + segura até que Auto-Numeração.
Se precisar te passo uma Tabela de exemplo. Teu e-mail é