2012-08-01 37 views
1

我正在做这个代码,并发生了一些奇怪的事情。 我从外部文件进行批量插入。但结果只是支离破碎,或者可能已经损坏。firebird嵌入模式中的碎片行

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)); 
       } 

而现在,突然对我表中的行看起来是这样的:

::[email protected] 

::[email protected] 

::m 
[email protected] 

::.com 
[email protected] 

::ail.com 
ab 

::@gmail.com 


::[email protected] 

::[email protected] 

::com 
[email protected] 

::il.com 
abc 

::gmail.com 

::[email protected] 

:: 

结果之间的空白不是由我做的。这是结果。对于外部表

源文件:

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

¿什么是错我的代码?

我已经多年没见过这个怪人的结果。 数据库是在第一次运行时为用户pc创建的。因此,每当我运行程序时都在生产中。

任何帮助,将不胜感激。

回答

0

在火鸟外部表文件不只是一个纯文本文件,它是一个固定宽度的格式有特殊要求的内容和布局。见海伦·博里281-287页Interbase的6.0数据定义指南,107-111页(提供下载http://www.firebirdsql.org/en/reference-manuals/)或火鸟书

我看到现在的问题是:

  1. 您在外部表声明列是VARCHAR(11), 而在你的文件最短EMAILADDRESS是13个字符,则 最长为21字符,所以火鸟将永远无法从文件
  2. 阅读 全EMAILADDRESS你没有指定你的换行​​符一个单独的列,所以你 换行符只会是被读取数据的一部分
  3. 你有德clared柱为VARCHAR,这需要记录 有一个非常特殊的格式,其中前两个字节声明其次是长度的字符串 的实际数据长度(而且当时 只读取高达的声明长度柱)。要么确保 您按照VARCHAR列的要求,或者干脆使用 CHAR数据类型,并确保你垫柱高达的 声明的长度空间。

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

+0

我非常惊讶,这段代码在我的老板发表演讲前一小时工作完美。 – jRam90 2012-08-04 22:08:57

+0

有了这个确切的代码,你总是会丢失任何字符串的前2个字符。 – 2012-08-05 08:14:38

+0

我坚信外部表格查询应该更加详细,它应该支持不同的标记,变量长度或更多的档案,如.xls(x)文件等等。我该如何推荐给开发者? – jRam90 2012-08-14 15:40:55

0

你能否提供示例文件?看来你准备查询的方式是错误的

也许你可以分割的步骤,每一个经过检查,第一次将文件读取,文件插入,然后如果你想要更多的从数据库中选择

主要支持列表帮助是火鸟支持和Firebird的Java

Firebird support lists

+0

实例文件位于底部:“外部表的源文件”。这是一个纯文本文件。我已经查询了每个查询,并且在创建外部表的部分出错:“CREATE TABLE EXT_TAB EXTERNAL'”+ txtarchivoProcesar.getText()+“'(CELULAR varchar(11))”。外部表输出根据数据类型和长度而不同,因此如果将varchar(300)或varchar(50)放在一起,那么输出会有很大差异。啧啧,我的意思是在我与我的老板进行演示之前的一个小时,这个工作正常... – jRam90 2012-08-03 14:30:01

+0

由于我工作地点的网络限制,我只是无法进入邮件列表。 – jRam90 2012-08-03 14:36:52

+0

您可以通过发送电子邮件到您的工作地址,通过发送电子邮件到[email protected] – 2012-08-04 17:52:53