파이어 버드 포함 모드에서 단편화 된 행

firebird java sql sqlbulkcopy

문제

나는이 코드를하고 있었고, 이상한 일이 일어났다. 외부 파일에서 대량 삽입을 만듭니다. 그러나 그 결과는 단지 파편화되거나 손상되었을 수 있습니다.

 cnx=factoryInstace.getConnection();
                pstmt = cnx.prepareStatement("DELETE FROM TEMPCELULAR");
                pstmt.executeUpdate();
                pstmt = cnx.prepareStatement("EXECUTE BLOCK AS BEGIN if (exists(select 1 from rdb$relations where rdb$relation_name = 'EXT_TAB')) then execute statement 'DROP TABLE EXT_TAB;'; END");
                pstmt.executeUpdate();
                pstmt = cnx.prepareStatement("CREATE TABLE EXT_TAB EXTERNAL '"+txtarchivoProcesar.getText()+"'(CELULAR varchar(11))");
                pstmt.executeUpdate();
                pstmt = cnx.prepareStatement("INSERT INTO TEMPCELULAR (CELULAR)SELECT CELULAR FROM EXT_TAB");
                pstmt.executeUpdate();
            pstmt = cnx.prepareStatement("SELECT CELULAR FROM TEMPCELULAR");
                ResultSet rs=pstmt.executeQuery();
                while(rs.next()){
                    System.out.println("::"+rs.getString(1));
                }

그리고 지금 갑자기 내 테이블에있는 행이 이렇게 보입니다.

::c@gmail.com

::abc2@gmail.

::m
abc3@gma

::.com
abc4@

::ail.com
ab

::@gmail.com


::bc6@gmail.c

::abc7@gmai

::com
abc8@g

::il.com
abc

::gmail.com

::c10@gmail.c

::

결과 사이의 공백은 나에 의해 만들어지지 않았습니다. 이것은 결과입니다.

외부 테이블의 소스 파일 :

abc@gmail.com
abc2@gmail.com
abc3@gmail.com
abc4@gmail.com
abc5@gmail.com
abc6@gmail.com
abc7@gmail.com
abc8@gmail.com
abc9@gmail.com
abc10@gmail.com
sneciosup@hotmail.com

 내 코드에 무슨 문제가 있습니까?

나는 수년에 걸쳐이 괴짜 결과를 보지 않았다. 데이터베이스는 첫 번째 실행시 사용자 pc로 생성됩니다. 따라서 프로덕션을 할 때마다 프로그램을 실행합니다.

어떤 도움을 주시면 감사하겠습니다.

수락 된 답변

Firebird의 외부 테이블 파일은 일반 텍스트 파일이 아니라 내용 및 레이아웃에 대한 특별한 요구 사항이있는 고정 너비 형식입니다. Interbase 6.0 데이터 정의 가이드 , 107-111 페이지 ( http://www.firebirdsql.org/en/reference-manuals/ 에서 다운로드 가능) 또는 Helen Borrie 의 Firebird Book 281-287 페이지를 참조하십시오.

지금 당면하는 문제점은 다음과 같습니다.

  1. 외부 테이블의 열을 VARCHAR (11)로 선언하고 파일의 가장 짧은 emailaddress는 13 자이고 가장 긴 것은 21 자이므로 Firebird는 파일에서 전체 전자 메일 주소를 읽을 수 없습니다
  2. 당신은 linebreaks에 대한 별도의 열을 지정하지 않으므로 linebreaks는 단순히 읽은 데이터의 일부가 될 것입니다
  3. 당신은 VARCHAR로 컬럼을 선언했다. 이것은 레코드가 매우 특정한 포맷을 요구한다. 처음 두 바이트는 실제 데이터 길이와 그 길이의 문자열을 선언한다. (심지어 컬럼의 선언 된 길이까지만 읽는다. ). VARCHAR 컬럼에 대한 요구 사항을 따르거나 단순히 CHAR 데이터 유형을 사용하고 선언 된 길이까지 공백으로 컬럼을 채워야합니다.

100 % 확신 할 수는 없지만 기본 데이터베이스 문자 집합도 데이터 읽는 방법에 관여 할 수 있습니다.


인기 답변

예제 파일도 제공 할 수 있습니까? 당신이 쿼리를 준비하는 방식이 잘못되었다고 생각합니다.

어쩌면 당신은 단계를 나눌 수 있고 각각 하나씩, 파일 읽기, 파일 삽입을 확인한 다음 데이터베이스에서 선택합니다.

Firebird 지원 및 Firebird-Java에 대한 추가 도움말이 필요한 경우 주요 지원 목록

파이어 버드 지원 목록



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.