Erro '80040e21' do provedor Microsoft OLE DB para drivers ODBC Uma operação OLE DB de várias etapas produziu um erro. Se possível, verifique cada valor de status do OLE DB. Nenhum trabalho é feito. Um programa de site, ocorreu um erro ao adicionar notícias
A seguir está a mensagem de erro:
Erro do provedor Microsoft OLE DB para drivers ODBC '80040e21'
A operação OLE DB em várias etapas gera erros. Se possível, verifique cada valor de status do OLE DB. Nenhum trabalho é feito.
O motivo desse erro é que alterei a string de conexão de acesso para Driver={Micorsoft Access Driver ()};dbq= & Server.Mappath(DbPath), enquanto a string de conexão original era Provier=Microsoft.Jet.OLEDB .4.0; Fonte de dados = & Server.Mappath (DbPath), este erro não ocorrerá. Parece que existem algumas diferenças entre essas duas formas de conexão ao banco de dados de acesso. Pelo menos o último método de conexão é melhor em termos de tolerância a falhas, mas é obviamente menos formal em termos de especificações.
Para simplificar, chamarei esses dois métodos de conexão de provedor e conexão de driver abaixo.
O erro acima não aparece ao modificar as notícias. Olhei o código e descobri que ao adicionar, um conjunto de registros obtido com Excute não foi fechado. Desliguei e não consegui fazer funcionar corretamente.
Então, escrevi um trecho de código e projetei uma tabela simples. Descobri que dois métodos de conexão poderiam ser adicionados neste momento, então alterei a tabela neste código de volta para a original, mas ainda não foi possível executá-la. Está relacionado ao relógio?
Então comecei a estudar o formulário com atenção e descobri que o formulário original tinha um campo numérico automático ao qual era atribuído um valor no programa. Lembro que números automáticos não podem receber valores. Então removi a numeração automática daquela tabela, e o resultado foi que ela poderia ser executada normalmente.
Parece que é possível atribuir valores ao campo de numeração automática conectando-se no modo Provedor.
Vamos falar sobre a diferença em outro lugar.
Quando usei o driver para conectar, apareceu um valor Nulo durante a configuração do canal, mas na verdade tinha um valor no banco de dados. Olhei o tipo de dados deste campo e era um comentário. Isso significa que o suporte do driver para notas longas não é muito bom? Não, o conteúdo das notícias na minha tabela de notícias deve ser notas. Esse não deveria ser o motivo.
Qual é o motivo? É porque ele está por trás de outra nota? No entanto, também há duas notas na tabela de notícias, e as notas de conteúdo também estão localizadas atrás das notas introdutórias. Essa suspeita também foi eliminada.
É porque este campo contém palavras-chave? Alterei o valor deste campo para 1, mas o resultado também deu errado.
Qual é o motivo?
Basta escrever outro teste de página. O código de teste é o seguinte.
A seguir está o código de teste:
Copie o código do código da seguinte forma:
conexão fraca
definir conn=server.createobject(adodb.recordset)
conn.open driver={driver de acesso Microsoft (*.mdb)};dbq= & server.mappath(data/dd.mdb) 'método de conexão do driver
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) 'método de conexão do provedor
defina rs=conn.execute(selecione * de s_channel onde channelID=11)
resposta.Write rs(UploadSetting)
rs.fechar
setrs = nada
Se for constatado que ambas as conexões podem produzir normalmente.
Então eu produzi (response.write) no código original onde o conjunto de registros acabou de ser aberto e descobri que o valor do campo poderia ser gerado normalmente naquele local. Então continuei movendo o código de saída para baixo e finalmente movi-o para
Aqui está o trecho de código:
Copie o código do código da seguinte forma:
se IsNull(rs(UploadSetting)) ou rs(UploadSetting)= então
UploadSetting=Dividir(1,2,3,4@Other@2@0@jpg|gif|bmp|png@100@1@swf@500@1@rm|mp3|wav|mid|avi|mpg|mpeg| asf|wma@2048@1@rar|zip|exe|doc|xls|chm@2048@1,@)
outro
UploadSetting=Dividir(rs(UploadSetting),@)
terminar se
Quando colocado acima de if, o conteúdo pode ser gerado normalmente, mas por que a saída Null é colocada depois de else?
Portanto, o código de teste final é o seguinte
A seguir está o código de teste:
Copie o código do código da seguinte forma:
conexão fraca
definir conn=server.createobject(adodb.recordset)
conn.open driver={driver de acesso Microsoft (*.mdb)};dbq= & server.mappath(data/dd.mdb) 'método de conexão do driver
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) 'método de conexão do provedor
defina rs=conn.execute(selecione * de s_channel onde channelID=11)
resposta.Write rs(UploadSetting)
se IsNull(Rs(UploadSetting)) ou rs(UploadSetting)= então
resposta.Escreva dd
outro
resposta.Write rs(UploadSetting)
terminar se
rs.fechar
setrs = nada
O código acima pode gerar corretamente o valor em rs(uploadSetting) quando conectado no modo provedor, mas não gerar nada no modo Driver.
Podemos entender isso: no modo Driver, o conteúdo do comentário só pode ser referenciado uma vez e se tornará um valor NULL quando referenciado novamente. Isso não acontecerá com o Provedor.
Para nos adaptarmos a esta situação, só podemos passar uma variável. Deixe o conteúdo do campo memo ser fornecido primeiro a uma variável, em vez de ser citado diretamente.