Поставщик 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;Data source=" & 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, где ChannelID=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, где ChannelID=11")
ответ. Напишите rs("UploadSetting")
если IsNull(Rs("UploadSetting")) или rs("UploadSetting")="" тогда
ответ.Напишите «дд»
еще
ответ. Напишите rs("UploadSetting")
конец, если
RS.закрыть
setrs=ничего
Приведенный выше код может правильно выводить значение в rs("uploadSetting") при подключении в режиме поставщика, но ничего не выводить в режиме драйвера.
Можем ли мы это понять: в режиме драйвера на содержимое примечания можно ссылаться только один раз, и при повторном обращении оно станет значением NULL. С провайдером этого не произойдет.
Чтобы адаптироваться к этой ситуации, мы можем передать только переменную. Пусть содержимое поля memo сначала будет передано в переменную, а не заключено в кавычки напрямую.