Você encontrará o seguinte erro comum ao usar o ActiveX
Data Objects (ADO) com Active Server Pages (ASP):
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access 97 Driver] A operação deve usar uma consulta
atualizável.
Este artigo explica as quatro principais causas desse erro
e as soluções alternativas correspondentes. Embora este artigo se refira a
banco de dados do Microsoft Access, as informações fornecidas também se aplicam
a outros tipos de banco de dados.
Esse erro geralmente ocorre quando seu script tenta
executar uma ATUALIZAÇÃO ou alguma outra ação que altera as informações no
banco de dados. Esse erro ocorre porque o ADO não grava no banco de dados por
um dos seguintes motivos:
- O motivo mais comum é o fato de a conta de convidado da
Internet (IUSR_MACHINE), que, por padrão, faz parte do grupo "Todos", não ter
permissões de gravação no arquivo de banco de dados (.mdb). Para corrigir esse
problema, use a guia Segurança no Explorer para ajustar as propriedades para
esse arquivo de modo que a conta de convidado da Internet tenha as permissões
corretas.
OBSERVAÇÃO: Ao usar o banco de dados do Microsoft Access com o ADO, também é
necessário conceder permissões de gravação à conta de convidado da Internet no
diretório que contém o arquivo .mdb. Isso ocorre porque o Jet cria um arquivo
.ldb para lidar com o bloqueio do banco de dados. Também é necessário conceder
permissões de leitura/gravação na pasta "Temp" porque o Jet pode criar arquivos
temporários nesse diretório. - Uma segunda causa desse erro é o fato de o banco de dados
não ser aberto com o MODO correto para gravação. Se você executar Abrir no
objeto Conexão, irá usar a propriedade Modo para indicar as permissões da
conexão, conforme mostrado aqui:
SQL = "UPDATE Products Set UnitPrice = 2;"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = 3 '3 = adModeReadWrite
Conn.Open "myDSN"
Conn.Execute(SQL)
Conn.Close
OBSERVAÇÃO: Por padrão, o MODO está configurado para 0(adModeUnknown), o que
geralmente permite atualizações. - Outra causa desse erro é o fato de a configuração "Somente
leitura" estar marcada na página Opções para esse DSN no ODBC
Manager.
- O último problema e a última solução alternativa refere-se
a qualquer fonte de dados SQL. O erro pode ser causado por instruções SQL que
violam a integridade referencial do banco de dados. Eis algumas consultas mais
comuns que falham:
- O grupo mais simples a usar é aquele que não altera:
consultas de tabela de referência cruzada, consulta passagem SQL, consultas de
união ou de atualização (ou de criação de tabela) que possuem propriedades
UniqueValue configuradas para Sim.
- Outra causa muito comum é quando a união inclui tabelas
ODBC vinculadas que não possuem índices únicos. Nesse caso, não há como o SQL
garantir que os registros são únicos em uma tabela que possui campos cujo valor
irá alterar com a consulta.
- Uma causa possui uma solução alternativa muito
eficiente. Se você tentar atualização um campo de união no lado "um" de uma
consulta "um-para-muitos", ela irá falhar, a menos que você ative atualizações
em cascata. Desse modo, você delega integridade referencial ao mecanismo do
JET.
Esse comportamento é próprio do projeto.