我想在JAVA上使用JDBC连接将空数据插入Teradata。 首先我试试这个:
PreparedStatement stmt;
String qm="Insert into db.user values (?,?,?,?,?,?,?)";
connection= DriverManager.getConnection
(
"jdbc:teradata://192.xxx.x.xx/database=DBC,tmode=ANSI,charset=UTF8","user","passw0rd" );
stmt = connection.prepareStatement(qm);
//some code here to open while loop
stmt.setObject(i,null); // This isnt working with Terada JDBC. It is working for Oracle and MSSQL JDBC
//and I finish my code
然后,我尝试了这个而不是stmt.setObject(i,null);
:
stmt.setNull(i,rsmd.getColumnType(i),rsmd.getColumnTypeName(i));
rsmd.getColumnType(i)
等于97
rsmd.getColumnTypeName(i)
等于DATE
是的,我的领域是DATE。
但它给出了这个错误:
ERROR : [Teradata JDBC Driver] [TeraJDBC 14.10.00.17] [Error 857] [SQLState HY000] Two different data types are being set for parameter 17 (449 & 749)
我该如何解决这个问题。
答案 0 :(得分:1)
我过去在TD的自定义数据库层中使用了setNull(i,Types。#字段类型#)。
但是,如果您搜索异常中返回的代码,您会发现它们代表Date和Varchar,就好像在同一位置一样,您有时会传递Date类型,有时也会传递Varchar。
您是否偶然将非空日期作为类似日期的字符串传递(例如" 2015-08-18"),而不是作为java.sql.Date对象?
如果是这种情况,您应该更改代码以使用java.sql.Date对象,这将解决您的问题。
答案 1 :(得分:0)
此问题的解决方法是将NULL转换为VARCHAR,以使其兼容。
INSERT INTO XYA(PKEY,REF_KEY) VALUES(2,cast(null as varchar(10)));
答案 2 :(得分:0)
通常,如果您希望将INSERT
NULL
值转换为ColC
,我建议您在INSERT ... VALUES
声明中使用以下方法:
INSERT (ColA, ColB, ColD, ColE) VALUES (1000, 'Testing Null', 1.00, DATE '2013-06-30);
Teradata将缺少INSERT
语句中的列,为列添加预定义的DEFAULT
值或NULL
。
如果您尝试以下操作该怎么办:
stmt.SetNull(i,Types.NULL)