2013-11-24 24 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,多次运行时将失败。删除这些表并清除目标表以再次运行。

相关问题