"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يقوم كود JDBC الخاص بي بطرح MySQLSyntaxErrorException على الرغم من استخدام عبارة INSERT صالحة؟

لماذا يقوم كود JDBC الخاص بي بطرح MySQLSyntaxErrorException على الرغم من استخدام عبارة INSERT صالحة؟

تم النشر بتاريخ 2024-11-07
تصفح:321

Why does my JDBC code throw a MySQLSyntaxErrorException despite using a valid INSERT statement?

استثناء JDBC: خطأ MySQLSyntaxError مع بيان SQL صالح

في هذه المقالة، نتعمق في مشكلة تمت مواجهتها عند استخدام JDBC لإدراج البيانات في ملف قاعدة بيانات ماي اس كيو ال. لقد تلقينا استثناء MySQLSyntaxError على الرغم من تنفيذ عبارة INSERT صالحة في MySQL Workbench.

للتحقق من السبب الأساسي، دعنا نحلل الكود:

public static boolean aggiungiElem(String nome, GrafoGenerico g){
    if(connessioneAperta()){
        try{
            String sqlCommandUser = "SELECT USER()";
            String sqlCommandInserim = "INSERT INTO salvataggi VALUES ( ? , ? , DEFAULT , NULL );";
            PreparedStatement sUser = conn.prepareStatement(sqlCommandUser);
            ... // Execute user query
            PreparedStatement sInserim = conn.prepareStatement(sqlCommandInserim);
            sInserim.setString(1, utente);
            sInserim.setString(2, nome);
            System.out.println(sInserim);
            sInserim.executeUpdate(sqlCommandInserim);
            ... // Close PreparedStatements and ResultSet
        }
        catch(SQLException e){
            e.printStackTrace();
            return false;
        }
    }
    else
        return false;
}

فحص تتبع المكدس:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? , ? , DEFAULT , NULL )' at line 1

يشير هذا الخطأ إلى وجود خطأ في بناء الجملة في عبارة SQL. ومع ذلك، يبدو أن بيان INSERT الخاص بنا صحيح.

عند الفحص الدقيق، نلاحظ أن أسلوب executeUpdate() يأخذ وسيطة سلسلة SQLCommandInserim بدلاً من sInserim PreviewdStatement. هذا خطأ في الكود.

الحل:

لحل هذه المشكلة، استبدل السطر التالي:

sInserim.executeUpdate(sqlCommandInserim);

مع:

sInserim.executeUpdate();

من خلال استدعاء ExecuteUpdate() في PreparationStatement، سيحل JDBC محل العناصر النائبة (؟) مع القيم التي تم تعيينها باستخدام طريقة setString ()، لمنع حدوث خطأ في بناء الجملة.

اعتبارات إضافية:

يوصى أيضًا باستخدام الكتلة النهائية لإغلاق قاعدة البيانات بالكامل الكائنات (PreparedStatements، وConnections، وStats، وResultSets) لمنع تسرب الموارد في حالة وجود استثناءات.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3