سؤال

كنت أحاول معرفة سبب عدم إنشاء الكود التالي أي بيانات في مجموعة النتائج الخاصة بي:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo");
ResultSet rs = prepStmt.executeQuery();

من ناحية أخرى ، يتم تشغيل ما يلي بشكل صحيح:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = 'Waterloo' ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
ResultSet rs = prepStmt.executeQuery();

نوع البيانات للمدرسة هو char (9 بايت). بدلاً من SetString ، حاولت أيضًا:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
String school = "Waterloo";
Reader reader = new CharArrayReader(school.toCharArray());
prepStmt.setCharacterStream(1, reader, 9);
prepStmt.setString(1, "Waterloo");
ResultSet rs = prepStmt.executeQuery();

أنا عالق تمامًا على ما يجب التحقيق فيه بعد ذلك ؛ يقول مصحح الأخطاء Eclipse إن استعلام SQL لا يتغير حتى بعد SetString أو SetCharacterStream. لست متأكدًا مما إذا كان ذلك بسبب أن إعداد المعلمات لا يعمل ، أو إذا لم يتمكن مصحح الأخطاء من التقاط التغييرات في الجهة المعدلة.

أي مساعدة سيكون موضع تقدير كبير ، شكرا!

هل كانت مفيدة؟

المحلول

أعتقد أن المشكلة هي أن نوع البيانات الخاص بك هو char (9) و "Waterloo" لديه 8 chars فقط. أفترض أن هذا سيعيد النتائج المتوقعة (مثل و ٪). أو إضافة المساحة المفقودة.

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();

أفضل طريقة لاستخدام Varchar بدلاً من Char إذا كانت سلاسلك لها طول مرن. ثم ستعمل المعدل كما هو متوقع.

يتمثل الحل البديل في استخدام طريقة SetFixedchar المحددة Oracle (ولكن من الأفضل تغيير نوع البيانات إلى Varchar إذا كان ذلك ممكنًا).

ما يلي من Oracle's ReparedStatement Javadoc:


بيانات char في قاعدة البيانات مبطنة بعرض العمود. يؤدي ذلك إلى قيود على استخدام طريقة setchar () لربط بيانات الحرف في جملة WHERE لبيان SELECT-يجب أن تكون بيانات الحرف في الفقرة ممتلئة أيضًا بعرض العمود لإنتاج تطابق في عبارة SELECT. هذا أمر مزعج بشكل خاص إذا كنت لا تعرف عرض العمود.

SetFixedchar () العلاجات هذا. تنفذ هذه الطريقة مقارنة غير متكافئة.

ملحوظات:

  • تذكر أن تدل على كائن البيان المعدل إلى OraclePreparedStatement لاستخدام طريقة setFixedchar ().
  • ليست هناك حاجة لاستخدام setFixedchar () لبيان إدراج. تقوم قاعدة البيانات دائمًا تلقائيًا بتسندات البيانات إلى عرض العمود أثناء إدراجها.

يوضح المثال التالي الفرق بين أساليب SetString () و setchar () و setFixedchar ().

// Schema is : create table my_table (col1 char(10));
//             insert into my_table values ('JDBC');
PreparedStatement pstmt = conn.prepareStatement
("select count() from my_table where col1 = ?");
ResultSet rs;

pstmt.setString (1, "JDBC");  // Set the Bind Value
rs = pstmt.executeQuery();    // This does not match any row
// ... do something with rs
CHAR ch = new CHAR("JDBC      ", null);
((OraclePreparedStatement)pstmt).setCHAR(1, ch); // Pad it to 10 bytes
rs = pstmt.executeQuery();     // This matches one row
// ... do something with rs
((OraclePreparedStatement)pstmt).setFixedCHAR(1, "JDBC");
rs = pstmt.executeQuery();     // This matches one row
// ... do something with rs
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top