如何为setAsciiStream方法提供正确的参数?

时间:2013-11-24 00:25:25

标签: java ascii

这是我的 FULL 测试代码,主要方法是:

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 个答案:

答案 0 :(得分:2)

它取决于表模式,但setAsciiStream的第三个参数是length。 所以

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";  

答案 1 :(得分:1)

我没有足够的声誉来评论,但我觉得这些信息对于第一次通过JDBC快速加载导航的人来说非常有价值。

此代码将获得完整的堆栈跟踪,对于快速加载诊断问题非常有用:

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

对于上面的代码,如果在连接字符串中指定TYPE = FASTLOADCSV,则它可以工作,但是由于创建了错误表_ERR_1和_ERR_2,多次运行时将失败。删除这些表并清除目标表以便再次运行。