ODBC 드라이버용 Microsoft OLE DB 공급자 오류 '80040e21' 다단계 OLE DB 작업에서 오류가 발생했습니다. 가능하다면 각 OLE DB 상태 값을 확인하세요. 작업이 완료되지 않았습니다. 홈페이지 프로그램, 뉴스 추가시 오류가 발생했습니다
다음은 오류 메시지입니다.
ODBC 드라이버용 Microsoft OLE DB 공급자 오류 '80040e21'
다단계 OLE DB 작업으로 인해 오류가 발생합니다. 가능하다면 각 OLE DB 상태 값을 확인하세요. 작업이 완료되지 않았습니다.
이 오류가 발생하는 이유는 원래 연결 문자열이 Provier=Microsoft.Jet.OLEDB .4.0;인 반면 액세스 연결 문자열을 Driver={Micorsoft Access Driver ()};dbq= & Server.Mappath(DbPath)로 변경했기 때문입니다. 데이터 소스= & Server.Mappath(DbPath), 이 오류는 발생하지 않습니다. 액세스 데이터베이스에 연결하는 이 두 가지 방법에는 약간의 차이가 있는 것 같습니다. 적어도 후자의 연결 방법이 내결함성 측면에서는 더 좋지만 사양 측면에서는 분명히 덜 형식적입니다.
단순화를 위해 아래에서는 이 두 가지 방법을 공급자 연결과 드라이버 연결이라고 부르겠습니다.
뉴스수정시 위와 같은 오류가 나오지 않습니다. 코드를 살펴보니 추가 시 Excute로 얻은 레코드 세트가 닫히지 않는 것을 발견했습니다. 전원을 꺼서 제대로 작동하지 못했습니다.
그래서 코드를 작성하고 간단한 테이블을 디자인했는데 이번에는 두 가지 연결 방법을 추가할 수 있다는 걸 발견하고, 이 코드에서 테이블을 다시 원래 코드로 변경했지만 여전히 실행이 되지 않았습니다. 시계와 관련이 있나요?
그래서 나는 양식을 주의 깊게 연구하기 시작했고 원래 양식에는 프로그램에서 값이 할당된 자동 숫자 필드가 있다는 것을 발견했습니다. 자동번호에는 값을 할당할 수 없는 것으로 기억합니다. 그래서 해당 테이블의 자동 번호 매기기를 제거했고, 그 결과 정상적으로 실행이 가능하다는 결과가 나왔습니다.
Provider 모드로 연결하면 자동 넘버링 필드에 값을 할당하는 것이 가능한 것 같습니다.
다른 곳에서의 차이점에 대해 이야기해 보겠습니다.
드라이버를 이용하여 연결을 해보니 채널 설정시 Null 값이 나오던데, 실제로는 데이터베이스에 값이 들어있는데 이 필드의 데이터 타입을 보니 코멘트였습니다. 그렇다면 드라이버의 긴 노트 지원이 별로 좋지 않다는 뜻인가요? 아니요, 내 뉴스 테이블의 뉴스 콘텐츠는 메모여야 합니다. 이것이 이유가 되어서는 안 됩니다.
이유는 무엇입니까? 그가 다른 메모 뒤에 있기 때문입니까? 그런데 뉴스 테이블에도 노트가 2개 있고, 내용 노트도 소개 노트 뒤에 위치해 있습니다. 이런 의혹도 해소됐다.
이 필드에 키워드가 있기 때문인가요? 이 필드의 값을 1로 변경했는데 결과도 틀렸습니다.
이유는 무엇입니까?
다른 페이지 테스트를 직접 작성해 보세요. 테스트 코드는 다음과 같습니다.
다음은 테스트 코드입니다.
다음과 같이 코드 코드를 복사합니다.
희미한 콘
conn=server.createobject(adodb.recordset) 설정
conn.open 드라이버={Microsoft 액세스 드라이버(*.mdb)};dbq= & server.mappath(data/dd.mdb) '드라이버 연결 방법
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) '공급자 연결 방법
rs=conn.execute 설정(channelID=11인 s_channel에서 * 선택)
응답.쓰기 rs(UploadSetting)
RS.닫기
설정자=아무것도 없음
두 연결 모두 정상적으로 출력될 수 있는 것으로 확인된 경우.
그래서 방금 레코드 셋을 오픈한 원본 코드에서 (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=분할(rs(UploadSetting),@)
종료하면
if 위에 배치하면 내용이 정상적으로 출력되는데, else 뒤에 배치하면 왜 Null이 출력되나요?
따라서 최종 테스트 코드는 다음과 같습니다.
다음은 테스트 코드입니다.
다음과 같이 코드 코드를 복사합니다.
희미한 콘
conn=server.createobject(adodb.recordset) 설정
conn.open 드라이버={Microsoft 액세스 드라이버(*.mdb)};dbq= & server.mappath(data/dd.mdb) '드라이버 연결 방법
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;데이터 소스= & server.mappath(data/dd.mdb) '공급자 연결 방법
rs=conn.execute 설정(channelID=11인 s_channel에서 * 선택)
응답.쓰기 rs(UploadSetting)
IsNull(Rs(UploadSetting)) 또는 rs(UploadSetting)=이면
응답. dd 쓰기
또 다른
응답.쓰기 rs(UploadSetting)
종료하면
RS.닫기
설정자=아무것도 없음
위 코드는 공급자 모드로 연결하면 rs(uploadSetting)의 값을 올바르게 출력할 수 있지만 드라이버 모드에서는 아무것도 출력하지 않습니다.
이것을 이해할 수 있습니까? 드라이버 모드에서는 발언 내용이 한 번만 참조될 수 있으며, 다시 참조하면 NULL 값이 됩니다. 공급자에게는 이런 일이 발생하지 않습니다.
이 상황에 적응하려면 변수만 전달할 수 있습니다. 메모 필드의 내용을 직접 인용하는 대신 먼저 변수에 제공하도록 하세요.