2012-08-01 83 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