2013-06-30 66 views
2

我想通过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

通常,如果你想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) 
+0

感谢您的回复,但我想在JDBC中使用preparerestatament。所以我没有改变使用你的方法,因为我不知道哪一列为空 –

+0

请参阅编辑答案的建议。 –

0

此问题的解决方法是将NULL转换为VARCHAR,以便它兼容。

INSERT INTO XYA(PKEY,REF_KEY) VALUES(2,cast(null as varchar(10))); 
+0

感谢您的支持。我正在使用JDBC连接。所以我需要使用SetObject或SetNull函数 –

1

我过去在TD定制DB层使用的setNull(I,类型#字段类型#)。

但是,如果您搜索异常中返回的代码,您会发现它们代表Date和Varchar,就好像在相同的位置上,有时会传递Date类型,有时传递Varchar。

您是否偶然将不为空的日期传递为类日期字符串(例如“2015-08-18”),而不是java.sql.Date对象?

如果是这种情况,您应该更改代码以使用java.sql.Date对象,这将解决您的问题。