2013-11-24 22 views
1

這是我FULL測試代碼的主要方法:如何向setAsciiStream方法提供正確的參數?

public class TestSetAscii { 

    public static void main(String[] args) throws SQLException, FileNotFoundException { 
     String dataFile = "FastLoad1.csv"; 
     String insertTable = "INSERT INTO " + "myTableName" + " VALUES(?,?,?)"; 
     Connection conStd = DriverManager.getConnection("jdbc:xxxxx", "xxxxxx", "xxxxx"); 
     InputStream dataStream = new FileInputStream(new File(dataFile)); 
     PreparedStatement pstmtFld = conStd.prepareStatement(insertTable); 
      // Until this line everything is awesome 

     pstmtFld.setAsciiStream(1, dataStream, -1); // This line fails 
     System.out.println("works"); 
    } 
} 

我得到的「cbColDef值超出範圍」錯誤

Exception in thread "main" java.sql.SQLException: [Teradata][ODBC Teradata Driver] Invalid precision: cbColDef value out of range 
    at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbc.SQLBindInParameterAtExec(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setStream(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setAsciiStream(Unknown Source) 
    at file.TestSetAscii.main(TestSetAscii.java:21) 

這裏是鏈接到我的FastLoad1.csv文件。我想這setAsciiStream因爲FastLoad1.csv文件的失敗,但我不知道

(在我以前question我沒能縮小問題,我有,現在我已經縮短了代碼。)

回答

2

這取決於表模式,但setAsciiStream的第三個參數是長度。 所以

pstmtFld.setAsciiStream(1, dataStream, 4); 

將工作的長度爲4個字節的字段。

但我不認爲它會像你期望的那樣在代碼中工作。對於每個綁定你應該有單獨的流。

此函數setAsciiStream()被設計用於大數據值BLOBS或long VARCHARS。它沒有設計爲逐行讀取csv文件並將它們分成不同的值。

基本上它只是用inputStream綁定其中一個問號。

尋找到所提供的例子之後,它看起來像Teradata數據可以處理的csv,但你必須明確地告訴有:

String urlFld = "jdbc:teradata://whomooz/TMODE=ANSI,CHARSET=UTF8,TYPE=FASTLOADCSV"; 
+0

+1謝謝。這實際上起作用。但我認爲「-1」意味着任何長度的領域(無限)。如何來「-1」不起作用 –

+0

當你說「綁定」,你的意思是列?準備好的聲明的問號?在這裏http://developer.teradata.com/doc/connectivity/jdbc/reference/current/samp/T20208JD.java.txt只有一個流 –

1

我沒有足夠的信譽發表評論,但我覺得這個信息能對於那些第一次通過JDBC進行快速加載的用戶來說是非常有價值的。

此代碼將得到完整的堆棧跟蹤並用於診斷與快速負載的問題非常有幫助:

catch (SQLException ex){ 
    for (; ex != null ; ex = ex.getNextException()) 
     ex.printStackTrace() ; 
} 

在上面的代碼的情況下,它的工作原理,如果你的連接字符串中指定TYPE = FASTLOADCSV但由於創建了錯誤表_ERR_1和_ERR_2,多次運行時將失敗。刪除這些表並清除目標表以再次運行。

相關問題