如何将 ascii 流绑定到准备好的语句

Posted

技术标签:

【中文标题】如何将 ascii 流绑定到准备好的语句【英文标题】:How to bind ascii stream to a prepared statement 【发布时间】:2014-03-07 00:40:27 【问题描述】:

我正在测试来自 official teradata website 的快速加载示例代码。为了谨慎起见,我使用位于他们的samples.jar here 上的示例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 是否足够聪明,可以打开、使用、关闭每个流 3 次? 表架构是什么? 该表与示例程序中完全相同developer.teradata.com/doc/connectivity/jdbc/reference/current/… 我创建了一个 FastLoad1.csv 文件,其中包含与示例程序中完全相同的三个变量 is jdbc smart enough to open 。 .我不知道那个 。 . .但是pstmtFld.setAsciiStream(1, dataStream, -1); 抛出错误 你不应该把它设置为 pstmtFld.setAsciiStream(3, dataStream, (int)(new File("FastLoad1.csv")).length()); 【参考方案1】:

我尝试编译示例 T20208JD,只是修改了 DNS/用户/密码,它在我的 Mac 上运行顺利。所以 pstmtFld.setAsciiStream(1, dataStream, -1); 似乎是正确的。

我使用的是 JDBC 14.10.00.18,您可以尝试从 Teradata 的 Developer Exchange 下载最新版本 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"; ` 和你的连接字符串有区别吗 我使用了示例中的那个,只是修改了用户和密码:“jdbc:teradata://xxx/TMODE=ANSI,CHARSET=UTF8,TYPE=FASTLOADCSV”。这与您的不同,TYPE=FASTLOAD 与 TYPE=FASTLOADCSV【参考方案2】:

我认为错误是由第三个参数-1 引起的,它告诉 setAsciiStream byteStream 有-1 字节。

当我过去使用setAsciiStream() 时,我使用bufferInputStreamString 的大小(如果它超过254 个字符)。

    String convRule;
     ...
    if (convRule.length() > 254) 
        int size = convRule.length();  
        BufferedInputStream bais = new BufferedInputStream( new ByteArrayInputStream( convRule.getBytes() ) );  
        pStmt.setAsciiStream( 4, bais, size );
    

所以,比较我的和你的,我可以看出第三个参数是不同的,应该是输入流的length

【讨论】:

@Buras 对不起,convRule 只是一个String,我只是从我使用setAsciiStream 的一些旧代码中复制了这个sn-p。

以上是关于如何将 ascii 流绑定到准备好的语句的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数绑定到未准备好的查询?

如何查看准备好的语句的内容?

如何使用准备好的语句动态绑定参数?

如何使用索引号将数据发送到mysqli(准备好的语句)

如何确定从我的 html 表单获取的输入值的数据类型,以便我可以使用它们在准备好的语句中绑定参数

准备好的语句和浮点数