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

Java 如何为setAscistream方法提供正确的参数?,java,ascii,Java,Ascii,这是我的完整测试代码,主要方法如下: public class TestSetAscii { public static void main(String[] args) throws SQLException, FileNotFoundException { String dataFile = "FastLoad1.csv"; String insertTable = "INSERT INTO " + "myTableName" + " VALUES(

这是我的完整测试代码,主要方法如下:

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");
    }
}
我得到“CBF值超出范围”错误

这是指向我的文件的链接。我猜
setascistream
会因为文件而失败,但我不确定


(在上一篇文章中,我无法缩小我遇到的问题。现在我缩短了代码。)

这取决于表架构,但setAsciStream的第三个参数是length。 所以

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

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

此函数setascistream()设计用于大数据值blob或long varchar。它不是用来逐行读取csv文件并将其拆分为单独的值

基本上,它只是将一个问号与inputStream绑定

查看提供的示例后,teradata似乎可以处理csv,但您必须明确指出:

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

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

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

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

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

+1谢谢。这确实有效。但我认为“-1”表示任何长度的字段(无限)。为什么你说“绑定”时“-1”不起作用?你是指列吗?准备好的声明的问号是什么?这里只有一条小溪
String urlFld = "jdbc:teradata://whomooz/TMODE=ANSI,CHARSET=UTF8,TYPE=FASTLOADCSV";  
catch (SQLException ex){
    for ( ; ex != null ; ex = ex.getNextException ())
        ex.printStackTrace () ;
}