【问题标题】:How to provide correct arguments to setAsciiStream method?如何为 setAsciiStream 方法提供正确的参数?
【发布时间】:2014-04-12 04:38:09
【问题描述】:

这是我的 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 中,我无法缩小我遇到的问题。现在我已经缩短了代码。)

【问题讨论】:

    标签: java ascii


    【解决方案1】:

    这取决于表模式,但 setAsciiStream 的第三个参数是长度。 所以

    pstmtFld.setAsciiStream(1, dataStream, 4);  
    

    适用于长度为 4 个字节的字段。

    但我认为它不会像您在代码中所期望的那样工作。对于每个绑定,您应该有单独的流。

    此函数 setAsciiStream() 旨在用于大数据值 BLOBS 或长 VARCHARS。它不是为逐行读取 csv 文件并将它们拆分为单独的值而设计的。

    基本上它只是将其中一个问号与 inputStream 绑定。

    查看提供的示例后,看起来 teradata 可以处理 csv,但您必须明确说明:

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

    【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 2016-09-18
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      相关资源
      最近更新 更多