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,这要求记录具有非常特定的格式,其中前两个字节声明实际数据长度,后跟该长度的字符串(即使这样,它也只能读取到声明的列长度)。要么确保遵循 VARCHAR 列的要求,要么只使用 CHAR 数据类型并确保用空格填充列,直到声明的长度。

我不是 100% 确定,但是您的默认数据库字符集也可能与读取数据的方式有关。

于 2012-08-04T17:50:06.557 回答