Поставщик Microsoft OLE DB для драйверов ODBC. Ошибка «80040e21». Многоэтапная операция OLE DB привела к ошибке. Если возможно, проверьте каждое значение состояния OLE DB. Никакая работа не ведется. Программа сайта, произошла ошибка при добавлении новости
Ниже приводится сообщение об ошибке:
Поставщик Microsoft OLE DB для драйверов ODBC, ошибка «80040e21»
Многоэтапная операция OLE DB генерирует ошибки. Если возможно, проверьте каждое значение состояния OLE DB. Никакая работа не ведется.
Причина этой ошибки в том, что я изменил строку подключения доступа на Driver={Micorsoft Access Driver ()};dbq= & Server.Mappath(DbPath), тогда как исходная строка подключения была Provier=Microsoft.Jet.OLEDB .4.0; Источник данных = & Server.Mappath(DbPath), эта ошибка не возникнет. Кажется, что между этими двумя способами подключения к базе данных доступа есть некоторые различия. По крайней мере, последний способ подключения лучше с точки зрения отказоустойчивости, но он явно менее формален с точки зрения технических характеристик.
Для простоты ниже я буду называть эти два метода подключением провайдера и подключением драйвера.
Вышеуказанная ошибка не появляется при изменении новостей. Я посмотрел код и обнаружил, что при добавлении набор записей, полученный с помощью Excute, не закрывается. Я выключил его и не смог заставить его работать корректно.
Итак, я написал фрагмент кода и разработал простую таблицу. Я обнаружил, что в этот момент можно добавить два метода подключения, поэтому я изменил таблицу в этом коде обратно на исходную, но ее все равно не удалось выполнить. Это связано с часами?
Поэтому я начал внимательно изучать форму и обнаружил, что исходная форма имела автоматическое числовое поле, которому в программе присваивалось значение. Я помню, что автоматическим номерам нельзя присваивать значения. Поэтому я удалил автоматическую нумерацию этой таблицы, и в результате ее можно было выполнять нормально.
Вроде бы можно присвоить значения полю автоматической нумерации, подключившись в режиме Provider.
О разнице поговорим в другом месте.
Когда я использовал драйвер для подключения, во время настройки канала появилось значение Null, но на самом деле оно имело значение в базе данных. Я посмотрел тип данных этого поля и обнаружил, что это комментарий. Означает ли это, что поддержка длинных нот драйвером не очень хороша? Нет, новости в моей таблице новостей должны быть заметками. Это не должно быть причиной.
В чем причина? Это потому, что он стоит за другой нотой? Однако в таблице новостей также есть две заметки, а примечания к содержанию также расположены за вступительными примечаниями. Это подозрение также было устранено.
Это потому, что в этом поле есть ключевые слова? Я изменил значение этого поля на 1, но результат тоже оказался неверным.
В чем причина?
Просто напишите еще один тест страницы. Код теста следующий.
Ниже приведен тестовый код:
Скопируйте код кода следующим образом:
тусклый контакт
set conn=server.createobject(adodb.recordset)
conn.open driver={Драйвер доступа Microsoft (*.mdb)};dbq= & server.mappath(data/dd.mdb) 'метод подключения драйвера
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) 'метод подключения поставщика
set rs=conn.execute(выберите * из s_channel, где идентификатор канала=11)
ответ. Напишите rs (UploadSetting)
RS.закрыть
setrs=ничего
Если обнаружено, что оба соединения могут выводить нормально.
Поэтому я вывел (response.write) в исходном коде, где набор записей был только что открыт, и обнаружил, что значение поля может быть выведено нормально в этом месте. Поэтому я продолжал перемещать выходной код вниз и, наконец, переместил его в
Вот фрагмент кода:
Скопируйте код кода следующим образом:
если IsNull(rs(UploadSetting)) или rs(UploadSetting)= тогда
UploadSetting=Split(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,@)
еще
UploadSetting=Split(rs(UploadSetting),@)
конец, если
При размещении над if содержимое может выводиться нормально, но почему при размещении после else выводится значение Null?
Итак, окончательный тестовый код выглядит следующим образом
Ниже приведен тестовый код:
Скопируйте код кода следующим образом:
тусклый контакт
set conn=server.createobject(adodb.recordset)
conn.open driver={Драйвер доступа Microsoft (*.mdb)};dbq= & server.mappath(data/dd.mdb) 'метод подключения драйвера
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) 'метод подключения поставщика
set rs=conn.execute(выберите * из s_channel, где идентификатор канала=11)
ответ. Напишите rs (UploadSetting)
если IsNull(Rs(UploadSetting)) или rs(UploadSetting)= тогда
ответ. Напишите дд
еще
ответ. Напишите rs (UploadSetting)
конец, если
RS.закрыть
setrs=ничего
Приведенный выше код может правильно выводить значение в rs(uploadSetting) при подключении в режиме поставщика, но ничего не выводить в режиме драйвера.
Можем ли мы это понять: в режиме драйвера на содержимое примечания можно ссылаться только один раз, и при повторном обращении оно станет значением NULL. С провайдером этого не произойдет.
Чтобы адаптироваться к этой ситуации, мы можем передать только переменную. Пусть содержимое поля memo сначала будет передано в переменную, а не заключено в кавычки напрямую.