firebird嵌入模式中的碎片行

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/下载)或The Firebird Book by Helen Borrie第281-287页。

我现在看到的问题是:

  1. 您将外部表中的列声明为VARCHAR(11),而文件中最短的电子邮件地址为13个字符,最长的是21个字符,因此Firebird永远无法从文件中读取完整的电子邮件地址
  2. 您没有为换行符指定单独的列,因此您的换行符将只是读取的数据的一部分
  3. 你已经将列声明为VARCHAR,这要求记录具有非常特定的格式,其中前两个字节声明实际数据长度后跟一个该长度的字符串(即使那时它只读取到列的声明长度) )。要么确保遵循VARCHAR列的要求,要么只使用CHAR数据类型,并确保使用空格填充列,直到声明的长度。

我不是100%肯定,但您的默认数据库字符集也可能涉及如何读取数据。


热门答案

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

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

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

Firebird支持列表



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因