كيف يمكنني في JDBC قراءة قيمة مزدوجة فارغة من النتائج؟

StackOverflow https://stackoverflow.com/questions/1103460

  •  12-09-2019
  •  | 
  •  

سؤال

لدي عمود في قاعدة البيانات الخاصة بي التي تمت كتابتها 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?
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top