PreparedStatement setNull (.. )


88

Java PreparedStatement ให้ความเป็นไปได้ในการตั้งค่า Null อย่างชัดเจน ความเป็นไปได้นี้คือ:

prepStmt.setNull(parameterIndex, Types.VARCHAR);

ความหมายของการเรียกนี้เหมือนกับเมื่อใช้ setType เฉพาะกับพารามิเตอร์ null หรือไม่

prepStmt.setString(null);

เหรอ?

คำตอบ:


76

คู่มือนี้กล่าวว่า:

6.1.5 การส่ง JDBC NULL เป็นพารามิเตอร์ IN

เมธอด setNull อนุญาตให้โปรแกรมเมอร์ส่งค่า JDBC NULL (SQL NULL ทั่วไป) ไปยังฐานข้อมูลเป็นพารามิเตอร์ IN อย่างไรก็ตามโปรดทราบว่ายังต้องระบุชนิด JDBC ของพารามิเตอร์

JDBC NULL จะถูกส่งไปยังฐานข้อมูลเมื่อค่า Java null ถูกส่งผ่านไปยังเมธอด setXXX (หากใช้วัตถุ Java เป็นอาร์กิวเมนต์) อย่างไรก็ตามเมธอด setObject สามารถรับค่า null ได้ก็ต่อเมื่อระบุชนิด JDBC

ใช่มันเทียบเท่ากัน


2
+1: น่าสนใจ ฉันคิดว่านั่นเป็นวิธีที่ setXXX ทำงานกับ null แต่ฉันไม่เคยทดสอบหรืออ่านเอกสารเลย
Powerlord

2
ฉันไม่คิดว่าจะมีบางอย่างเช่น myPreparedStatement.setInteger (myIntegerObject) (แม้ว่าฉันจะเห็นว่าไม่มีชื่อเมธอดที่แน่นอน) ในกรณีที่ฉันต้องการใช้จำนวนเต็มที่อาจเป็นค่าว่าง? ไม่เช่นนั้นฉันจะต้องใช้คำสั่ง if / else เรียก. setInt () ทางเดียวและ. setNull () อีกทางหนึ่งซึ่งดูน่าเบื่อไปหน่อย

@ardave ใช่นั่นคือสิ่งที่ฉันหมายถึงในย่อหน้าสุดท้ายของฉัน
djna

1
ฉันรู้ว่ามันเก่า แต่ลิงค์นั้นเสีย
Moob

1
ลิงค์ใหม่: PreparedStatement
candidus

77

แต่ระวังสิ่งนี้ ....

Long nullLong = null;

preparedStatement.setLong( nullLong );

- แสดงข้อยกเว้นของตัวชี้ null -

เพราะ protype คือ

setLong( long )   

ไม่

setLong( Long )

เป็นคนดีที่จับคุณออก


นั่นคือตัวอย่างที่ทำให้ฉันมาที่นี่
sf_jeff

13

ในที่สุดฉันก็ทำการทดสอบเล็ก ๆ น้อย ๆ และในขณะที่ฉันกำลังเขียนโปรแกรมมันก็อยู่ในใจของฉันว่าหากไม่มีเมธอด setNull (.. ) จะไม่มีวิธีใดที่จะตั้งค่า Null สำหรับ Java primitives สำหรับ Objects ทั้งสองวิธี

setNull(..)

และ

set<ClassName>(.., null)) 

ปฏิบัติในลักษณะเดียวกัน



4
preparedStatement.setNull(index, java.sql.Types.NULL);

ที่ควรใช้ได้กับทุกประเภท แม้ว่าในบางกรณีความล้มเหลวจะเกิดขึ้นบนฝั่งเซิร์ฟเวอร์เช่นสำหรับ SQL:

COALESCE(?, CURRENT_TIMESTAMP)

Oracle 18XEล้มเหลวด้วยประเภทที่ไม่ถูกต้อง: คาดว่าDATEได้STRING- นั่นคือความล้มเหลวที่ถูกต้องสมบูรณ์

บรรทัดล่าง: เป็นการดีที่จะทราบประเภทหากคุณโทร .setNull()

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.