如何将ASCII流绑定到预处理语句中

3
我正在测试来自Teradata官方网站的fastload示例代码。为了保险起见,我使用他们在这里的samples.jar中位于FastLoad1.csv文件夹中的示例文件。

运行此示例代码时,在此行中出现错误:

  pstmtFld.setAsciiStream(1, dataStream, -1); // This method is not implemented

如何在预处理语句中使用setAsciiStream?

我是否正确地使用了setAsciiStream


这是控制台中的错误消息。

 Attempting connection to Teradata with FastLoadCSV.
 Connection to Teradata with FastLoadCSV established.
 Creating a PreparedStatement object with FastLoadCSV.
 Created a PreparedStatement object with FastLoadCSV.
 Checking connection for warnings
 Streaming FastLoad1.csv
SQL State = HY000, Error Code = 1151
com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata JDBC Driver] [TeraJDBC 14.10.00.17] [Error 1151] [SQLState HY000] A failure occurred while setting a parameter value for database table "xxxxxxxxx"."my_table". Details of the failure can be found in the exception chain that is accessible with getNextException.
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:93)
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:68)
    at com.teradata.jdbc.jdbc.fastload.FastLoadManagerPreparedStatement.setAsciiStream(FastLoadManagerPreparedStatement.java:1366)
    at T20208JD.main(T20208JD.java:160)

SQL State = HY000, Error Code = 1155
com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata JDBC Driver] [TeraJDBC 14.10.00.17] [Error 1155] [SQLState HY000] The next failure(s) in the exception chain occurred in FastLoadPreparedStatement[0] of 16 FastLoadPreparedStatement(s).
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:93)
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:73)
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:101)
    at com.teradata.jdbc.jdbc.fastload.FastLoadManagerPreparedStatement.setAsciiStream(FastLoadManagerPreparedStatement.java:1361)
    at T20208JD.main(T20208JD.java:160)

SQL State = HY000, Error Code = 1093
com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata JDBC Driver] [TeraJDBC 14.10.00.17] [Error 1093] [SQLState HY000] This method is not implemented
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:93)
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:63)
    at com.teradata.jdbc.jdbc.fastload.FastLoadPreparedStatement.setAsciiStream(FastLoadPreparedStatement.java:759)
    at com.teradata.jdbc.jdbc.fastload.FastLoadManagerPreparedStatement.setAsciiStream(FastLoadManagerPreparedStatement.java:1359)
    at T20208JD.main(T20208JD.java:160)


SQL State = HY000, Error Code = 1151
com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata JDBC Driver] [TeraJDBC 14.10.00.17] [Error 1151] [SQLState HY000] A failure occurred while setting a parameter value for database table "xxxxxxxx"."my_table". Details of the failure can be found in the exception chain that is accessible with getNextException.
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:93)
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:68)
    at com.teradata.jdbc.jdbc.fastload.FastLoadManagerPreparedStatement.setAsciiStream(FastLoadManagerPreparedStatement.java:1366)
    at T20208JD.main(T20208JD.java:160)

SQL State = HY000, Error Code = 1155
com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata JDBC Driver] [TeraJDBC 14.10.00.17] [Error 1155] [SQLState HY000] The next failure(s) in the exception chain occurred in FastLoadPreparedStatement[0] of 16 FastLoadPreparedStatement(s).
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:93)
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:73)
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:101)
    at com.teradata.jdbc.jdbc.fastload.FastLoadManagerPreparedStatement.setAsciiStream(FastLoadManagerPreparedStatement.java:1361)
    at T20208JD.main(T20208JD.java:160)

SQL State = HY000, Error Code = 1093
com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata JDBC Driver] [TeraJDBC 14.10.00.17] [Error 1093] [SQLState HY000] This method is not implemented
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:93)
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:63)
    at com.teradata.jdbc.jdbc.fastload.FastLoadPreparedStatement.setAsciiStream(FastLoadPreparedStatement.java:759)
    at com.teradata.jdbc.jdbc.fastload.FastLoadManagerPreparedStatement.setAsciiStream(FastLoadManagerPreparedStatement.java:1359)
    at T20208JD.main(T20208JD.java:160)

Exception in thread "main" java.lang.IllegalStateException: Sample failed.
    at T20208JD.main(T20208JD.java:336)

JDBC 是否足够智能,在此情况下打开、使用、关闭每个流三次? - Leo
表结构是什么? - Giovanni Botta
表格与示例程序中完全相同:http://developer.teradata.com/doc/connectivity/jdbc/reference/current/samp/T20208JD.java.txt我创建了一个包含三个变量的FastLoad1.csv文件,这些变量与示例程序中完全相同。 - Buras
JDBC 是否聪明到足以打开……我不知道……但是 pstmtFld.setAsciiStream(1, dataStream, -1); 抛出了一个错误。 - Buras
我尝试过这个。但是在他们的示例中,他们使用了 pstmtFld.setAsciiStream(1, dataStream . . ,尽管他们有三个字段。这是一个官方网站,所以我怀疑他们是否有错别字 http://developer.teradata.com/doc/connectivity/jdbc/reference/current/samp/T20208JD.java.txt - Buras
显示剩余2条评论
2个回答

8
我尝试编译了示例T20208JD,并修改了DNS/用户/密码,它在我的Mac上顺利运行。因此,pstmtFld.setAsciiStream(1, dataStream, -1);似乎是正确的。
我使用的是JDBC 14.10.00.18版本,您可以尝试从Teradata的开发者交流平台下载最新版本14.10.00.26:http://downloads.teradata.com/download/connectivity/jdbc-driver 我不认为这会解决问题,但是...

+1 谢谢,我已经更新了JDBC但没有结果。顺便问一下,你在使用什么连接字符串?我的是String urlFld = "jdbc:teradata://XXX/LOGMECH=LDAP,tmode=ANSI,charset=UTF8,LOGDATA='authcid=userid password=mypassword',TYPE=FASTLOAD"; - Buras
它是否与您的连接字符串有所不同? - Buras
我使用了示例中的代码,只是修改了用户名和密码:"jdbc:teradata://xxx/TMODE=ANSI,CHARSET=UTF8,TYPE=FASTLOADCSV"。这与您的代码不同,其中 TYPE=FASTLOAD 改为了 TYPE=FASTLOADCSV。 - dnoeth

1
我认为错误是由第三个参数 -1 引起的,它告诉 setAsciiStream 字节流有 -1 个字节。
过去我使用 setAsciiStream() 时,如果字符串超过 254 个字符,我会使用一个 bufferInputStreamString 的大小。
    String convRule;
     ...
    if (convRule.length() > 254) {
        int size = convRule.length();  
        BufferedInputStream bais = new BufferedInputStream( new ByteArrayInputStream( convRule.getBytes() ) );  
        pStmt.setAsciiStream( 4, bais, size );
    }

所以,与你的进行比较后,我可以看出第三个参数是不同的,应该是输入流的长度

@Buras 对不起,convRule只是一个String,我只是从一些旧代码中复制了这个片段,当时我使用了setAsciiStream - Mason T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接