ODBCCommand.executesCalar ()가 AccessViolationException을 던지는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/228274

문제

데이터베이스 테이블에서 텍스트 설명을 가져와 텍스트 파일에 저장하려는 코드 블록이 있습니다. 다음과 같습니다 (C# .NET) :

        OdbcCommand getItemsCommand = new OdbcCommand("SELECT ID FROM ITEMS", databaseConnection);
        OdbcDataReader getItemsReader = getItemsCommand.ExecuteReader();
        OdbcCommand getDescriptionCommand = new OdbcCommand("SELECT ITEMDESCRIPTION FROM ITEMS WHERE ID = ?", databaseConnection);
        getDescriptionCommand.Prepare();
        while (getItemsReader.Read())
        {
            long id = getItemsReader.GetInt64(0);
            String outputPath = "c:\\text\\" + id + ".txt";
            if (!File.Exists(outputPath))
            {
                getDescriptionCommand.Parameters.Clear();
                getDescriptionCommand.Parameters.AddWithValue("id", id);
                String description = (String)getDescriptionCommand.ExecuteScalar();
                StreamWriter outputWriter = new StreamWriter(outputPath);
                outputWriter.Write(description);
                outputWriter.Close();
            }
        }
        getItemsReader.Close();

이 코드는 데이터의 일부를 .txt 파일에 성공적으로 저장했지만 많은 행의 경우 AccessViolationException이 다음 줄에 발생합니다.

                String description = (String)getDescriptionCommand.ExecuteScalar();

예외 텍스트는 "보호 된 메모리를 읽거나 쓰려고 시도합니다. 이것은 종종 다른 메모리가 손상되었음을 나타냅니다".

이 프로그램은 일반적으로 테이블의 동일한 행에서 예외를 던지지 만 100% 일관된 것으로 보이지 않습니다. 때로는 과거에 예외를 던진 데이터가 갑자기 효과가있을 것입니다.

어떤 사람들은 의심 할 여지없이 내가 왜 ID를 선택하지 않았는지, getItemsCommand의 항목에서 ItemDescription을 선택하고 두 번째 쿼리를 건너 뛰는 지 궁금합니다. 실제로, 나는 처음에 그런 식으로했고, getItemsCommand.getString ()과 동일한 오류를 발견했습니다. 아마도 데이터 세트가 너무 많은 메모리를 차지하고 있었을 것입니다. 아마도 오류가 발생했을 것입니다. 그래서 나는 그것이 도움이 될지 확인하기 위해이 방법을 시도하기로 결정했습니다. 그렇지 않았습니다. 왜 이런 일이 일어날 지 아는 사람이 있습니까?

그건 그렇고, ID는 int이고 ItemDescription은 Varchar (32000) 열입니다. 차이가있는 경우 데이터베이스는 Borland Interbase 6.0 (ICK!)입니다.

편집 : 예외가 발생했던 곳을 설명 할 때 잘못된 줄을 주었다 !! 아르 !! 지금 고정되었습니다. 또한 지금까지 제안 된 것들을 시도했지만 도움이되지 않았습니다. 그러나 데이터베이스의 아주 오래된 레코드 만이이 오류를 일으킨다는 것을 알았습니다. 지난 5 년 안에 삽입 된 레코드 만 풀도록 쿼리를 변경하면 아무런 문제가 없습니다. 누군가가 나에게 제안한 전환 문제 일 수 있습니까?

업데이트: 그것을 해결했습니다. 이 문제는 매우 신뢰할 수없는 데이터베이스 소프트웨어에 대한 ODBC 드라이버의 버그로 판명되었습니다. 다른 드라이버와의 해결 방법으로 문제가 해결되었습니다.

도움이 되었습니까?

해결책

사용중인 ODBC 드라이버의 버그 일 수 있습니다. 그것은 어떤 운전자입니까? 연결 문자열은 무엇입니까?

다른 팁

여기 어둠 속에서 샷 ...

독자를 실행하고 결과를 저장 (어쩌면 배열 또는 목록에)을 저장하고 다음 명령을 실행하거나 준비하기 전에 독자가 닫혀 있는지 확인하십시오. 다음 명령을 실행하기 전에 리소스가 열리지 않음을 알 수 있도록 극도로 가서 getItemsCommand 구성을 사용하여 사용하는 블록 내부에 넣을 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top