如果我总是在准备好的语句中使用 varchar 设置 null 会发生啥?

Posted

技术标签:

【中文标题】如果我总是在准备好的语句中使用 varchar 设置 null 会发生啥?【英文标题】:What would happen if I set null in prepared statement with varchar always?如果我总是在准备好的语句中使用 varchar 设置 null 会发生什么? 【发布时间】:2009-07-31 22:57:17 【问题描述】:

我有这种方法使用 jdbc 插入数据,该方法将根据 java 类型插入值。像这样的:

Object o = map.get( key );

if( o == null ) 
    // setNull( index );
 else  if( o instanceof String ) 
    // setString( index, (String) o );
 else if( o instanceof Timestamp ) 
    // setTimestampt( index, ( Timestamp ) o );
 else if( o instanceof Integer ) 
    // setInt( index, (Integer) o );

    index++;

它有一个问题(旁边都是评论:P)

如果o的值为null,我需要使用"setNull(int, int)"方法,但是我必须指定SQL类型

...注意:您必须指定参数的 SQL 类型。

但是...我不知道类型,所以我正在考虑使用 always VARCHAR(只是因为)

setNull( index,Types.VARCHAR); .

如果我在准备好的语句中始终使用 varchar 设置 null 会发生什么?

我正在使用:

Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

使用 Oracle JDB 驱动程序:

11.1.0.7.0-Production ( ojdbc6.jar ) 

还有什么选择?

【问题讨论】:

【参考方案1】:

不能通过ResultSetMetaData接口查询数据库获取列类型吗?

【讨论】:

有点复杂。我在玩弄额外的活力(有点)所以我真的不知道列的确切位置。但相反,我根据列名设置位置(例如 EMPL_ID 可能是第 20 列,但我将其设置为我 pstmt 上的第 1 列.....) 等等,等等……它开始变得有意义了……嗯嗯……让我咀嚼一会儿……如果我这样做(从表中选择 * 1 = 0 ; 获取 ResultSetMetadata 并使用列名获取类型 ...(不!我将来会看到另一个 Map ...)... 你不能得到作为输入的值和类型,而不仅仅是你现在得到的值吗? @OpenSource... 我可能会,只是源不是 SQL 表 爱地图,奥斯卡。像兄弟一样爱他们。

以上是关于如果我总是在准备好的语句中使用 varchar 设置 null 会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

准备好的语句总是返回 -2 值

如果在循环中使用 MySQLi 准备好的语句,我啥时候调用 bind_param?

当它们包含 ROW_NUMBER() 时,JDBC-driver / SQL Server 总是重新编译我准备好的语句

更新数据库中的数据 - 准备好的语句(PHP)

使用准备好的语句构建 PDO 动态查询

准备好的语句何时失败?