1

私はこのコードを実行していましたが、奇妙なことが起こりました。外部ファイルから一括挿入します。しかし、その結果、断片化されているか、破損している可能性があります。

 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 から作成されます。したがって、プログラムを実行するたびに本番環境にいます。

どんな助けでも大歓迎です。

4

1 に答える 1

0

Firebird の外部テーブル ファイルは単なるプレーンテキスト ファイルではなく、コンテンツとレイアウトに特別な要件がある固定幅形式です。Interbase 6.0 Data Definition Guideの107 ~ 111 ページ ( http://www.firebirdsql.org/en/reference-manuals/からダウンロード可能) またはHelen Borrie 著の The Firebird Book の281 ~ 287 ページを参照してください。

私が今見ている問題は次のとおりです。

  1. 外部テーブルの列を VARCHAR(11) として宣言しますが、ファイルの最短の電子メール アドレスは 13 文字、最長は 21 文字であるため、Firebird はファイルから完全な電子メール アドレスを読み取ることはできません。
  2. 改行に別の列を指定しないため、改行は単に読み取られるデータの一部になります
  3. 列を VARCHAR として宣言しました。これには、最初の 2 バイトで実際のデータ長を宣言し、その後にその長さの文字列を宣言する、非常に特殊な形式のレコードが必要です (それでも、列の宣言された長さまでしか読み取れません)。 )。VARCHAR 列の要件に従っていることを確認するか、単純に CHAR データ型を使用して、宣言された長さまで列にスペースを埋め込むようにしてください。

100% 確実ではありませんが、デフォルトのデータベース文字セットもデータの読み取り方法に関係している可能性があります。

于 2012-08-04T17:50:06.557 に答える