firebird嵌入模式中的碎片行

时间:2012-08-01 21:01:53

标签: java sql firebird 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创建的。因此,每次我运行程序时都在生产中。

任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:0)

你能提供示例文件吗?似乎你准备查询的方式是错误的

也许你可以拆分步骤并检查每一步,首先是文件读取,文件插入然后从数据库中选择

如果您需要更多帮助,主要支持列表是Firebird支持和Firebird-Java

Firebird support lists

答案 1 :(得分:0)

Firebird中的外部表文件不仅仅是一个纯文本文件,它是一种固定宽度的格式,对内容和布局有特殊要求。请参阅 Interbase 6.0数据定义指南,第107-111页(可从http://www.firebirdsql.org/en/reference-manuals/下载)或 The Firebird Book ,作者:Helen Borrie,第281-287页。< / p>

我现在看到的问题是:

  1. 您将外部表中的列声明为VARCHAR(11), 而你文件中最短的电子邮件地址是13个字符 最长的是21个字符,因此Firebird永远无法读取 来自文件的完整电子邮件地址
  2. 您没有为换行符指定单独的列,因此您的 linebreaks将只是读取数据的一部分
  3. 您已将列声明为VARCHAR,这需要记录 有一个非常特定的格式,前两个字节声明 实际的数据长度后面跟着一个长度的字符串(甚至是它 只读取列的声明长度)。要么确定 您遵循VARCHAR列的要求,或者只是使用 CHAR数据类型,并确保用空格填充列 声明的长度。
  4. 我不是百分百确定,但您的默认数据库字符集也可能涉及数据的读取方式。