كيف يمكنني في JDBC قراءة قيمة مزدوجة فارغة من النتائج؟
سؤال
لدي عمود في قاعدة البيانات الخاصة بي التي تمت كتابتها double
وأريد أن أقرأ القيمة منه باستخدام نتائج JDBC، ولكن قد تكون فارغة. ما هي أفضل طريقة للقيام بذلك؟ أستطيع أن أفكر في ثلاثة خيارات لا أحد منها تبدو جيدة جدا.
الخيار 1: سيء لأن الاستثناء التعامل مع المطابق وشبه رائحة كريهة
double d;
try {
d = rs.getDouble(1);
// do something
} catch(SQLException ex) {
if(rs.wasNull()) {
// do something else
} else {
throw ex;
}
}
الخيار 2: سيئة لأن اثنين من الجمل
s = rs.getString(1); // or getObject()
if(s == null) {
// do something else
} else {
double d = rs.getDouble(1);
// do something
}
الخيار 3: سيئة لأن جافا بدلا من تحويل SQL
s = rs.getString(1); // or getObject()
if(s == null) {
// do something else
} else {
double d = Double.parseDouble(s);
// do something
}
أي اقتراحات بأي طريقة أفضل، أم أن هناك طريقة أخرى متفوقة؟ والرجاء لا تقل "استخدام السبات"، أنا مقصور على رمز JDBC هنا فقط.
المحلول
الخيار 1 هو الأقرب:
double d = rs.getDouble(1);
if (rs.wasNull()) {
// do something
} else {
// use d
}
انها ليست لطيفة جدا، ولكن هذا JDBC. إذا كان العمود فارغا، فإن القيمة المزدوجة تعتبر "سيئة"، لذلك يجب عليك التحقق من استخدام wasNull()
في كل مرة تقوم فيها بقراءة بدائية غير قابلة للغة في قاعدة البيانات.
نصائح أخرى
اعتمادا على برنامج تشغيل JDBC وقاعدة البيانات الخاصة بك، قد تتمكن من استخدام نوع محاصر ومقياس:
Double doubleValueOrNull = (Double)rs.getObject(1); // or .getObject("columnName")
سيكون ذلك null
إذا كان العمود NULL
.
كن حذرا للتحقق من ذلك لا يزال يعمل إذا قمت بتغيير قاعدة البيانات.
يستخدم:
rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()
أو مع Java 8 يمكنك القيام بذلك:
Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
.map(BigDecimal::doubleValue).orElse(null));
إصدار Kotlin لاسترداد حقل غير قابل للانهيار:
val parentId = resultSet.getObject("parent_id") as Double?