বিবৃতি সহ প্রিপেইড স্টেটমেন্ট RE RETURN_GENERATED_KEYS


83

কিছু জেডিবিসি ড্রাইভারকে ফিরে আসার একমাত্র উপায় Statement.RETURN_GENERATED_KEYSহ'ল নিম্নলিখিত কিছু করা:

long key = -1L;
Statement statement = connection.createStatement();
statement.executeUpdate(YOUR_SQL_HERE, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = statement.getGeneratedKeys();
if (rs != null && rs.next()) {
    key = rs.getLong(1);
}

এর সাথে কি করার উপায় আছে PreparedStatement?


সম্পাদনা করুন

PreparedStatementনিম্নলিখিত পরিস্থিতি বিবেচনা করে যদি আমি একই কাজ করতে পারি কিনা তা জানতে চেয়েছিলাম :

private static final String SQL_CREATE = 
            "INSERT INTO
            USER(FIRST_NAME, MIDDLE_NAME, LAST_NAME, EMAIL_ADDRESS, DOB) 
            VALUES (?, ?, ?, ?, ?)";

ইন USERটেবিল সেখানে এর PRIMARY KEY (USER_ID)যা একটি BIGINT AUTOINCREMENT(অত: পর কেন আপনি তা না দেখতে পান SQL_CREATEস্ট্রিং।

এখন আমি পূরণ ?ব্যবহার PreparedStatement.setXXXX(index, value)। আমি ফিরে যেতে চাই ResultSet rs = PreparedStatement.getGeneratedKeys()। আমি কীভাবে এটি অর্জন করতে পারি?


4
অনেক লোক ভুল বোঝে এবং প্রিপেইডস্টেটমেন্ট # এক্সিকিউটিউপডেট (আরগ) ব্যবহার করে। জাভা ডক বলেছেন This method with argument cannot be called on a PreparedStatement or CallableStatement.এটির অর্থ আমাদের প্রস্তুতির স্টেটমেন্ট executeUpdate(arg)ক্লাসে উত্তরাধিকার সূত্রে প্রাপ্ত হওয়া সত্ত্বেও যুক্তি ছাড়াই এক্সিকিউটিউটেড () ব্যবহার করতে হবে তবে আমাদের এটি ব্যবহার করতে হবে না অন্যথায় আমরা এসকিউএলএক্সসেপশন পেয়ে যাব।
অমিতজি

উত্তর:


143

আপনি হয় prepareStatementঅতিরিক্ত intপরামিতি গ্রহণ পদ্ধতিটি ব্যবহার করতে পারেন

PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)

কিছু জেডিবিসি ড্রাইভারের জন্য (উদাহরণস্বরূপ, ওরাকল) আপনাকে স্পষ্টভাবে উত্পন্ন কীগুলির কলামের নাম বা সূচকগুলি তালিকাবদ্ধ করতে হবে:

PreparedStatement ps = con.prepareStatement(sql, new String[]{"USER_ID"})

আপনি একই উত্তরটি অর্জনের আরও উপায় দেখিয়েছেন বলে আমি আপনার উত্তর গ্রহণ করেছি।
বুহাকে সিন্ধি

67

তুমি এরকম কিছু বোঝাতে চাও?

long key = -1L;

PreparedStatement preparedStatement = connection.prepareStatement(YOUR_SQL_HERE, PreparedStatement.RETURN_GENERATED_KEYS);
preparedStatement.setXXX(index, VALUE);
preparedStatement.executeUpdate();

ResultSet rs = preparedStatement.getGeneratedKeys();

if (rs.next()) {
    key = rs.getLong(1);
}

উত্পন্ন কী কী ফলাফল সেট বাতিল হতে পারে?
অ্যালিকেলজিন-কিলাকা

10

এই মুহূর্তে আমার দ্বারা একটি সংকলক না পেয়ে, আমি একটি প্রশ্ন জিজ্ঞাসা করে উত্তর দেব:

আপনি কি এই চেষ্টা করেছেন? এটা কি কাজ করে?

long key = -1L;
PreparedStatement statement = connection.prepareStatement();
statement.executeUpdate(YOUR_SQL_HERE, PreparedStatement.RETURN_GENERATED_KEYS);
ResultSet rs = statement.getGeneratedKeys();
if (rs != null && rs.next()) {
    key = rs.getLong(1);
}

দাবি অস্বীকার: অবশ্যই, আমি এটি সংকলন করি নি, তবে আপনি ধারণাটি পান।

PreparedStatement একটি subinterface হয় বিবৃতি , তাই আমি একটি কারণ দেখতে পাচ্ছি না কেন এই না would কাজ, যদি না কিছু JDBC এর ড্রাইভার বগী হয়।


এটি আমি যা খুঁজছি তা নয় আমি জানি এটি PreparedStatementএকটি সাবক্লাস Statement.... আমার আপডেট হওয়া পোস্টটি দেখুন।
বুহাকে সিন্ধি

2
String query = "INSERT INTO ....";
PreparedStatement preparedStatement = connection.prepareStatement(query, PreparedStatement.RETURN_GENERATED_KEYS);

preparedStatement.setXXX(1, VALUE); 
preparedStatement.setXXX(2, VALUE); 
....
preparedStatement.executeUpdate();  

ResultSet rs = preparedStatement.getGeneratedKeys();  
int key = rs.next() ? rs.getInt(1) : 0;

if(key!=0){
    System.out.println("Generated key="+key);
}

যদি উত্পন্ন হয় তবে কীটি অন্যথায় কী = 0 যদি উত্পন্ন না হয়
ধর্মেন্দ্রসিংহ চুদাসাম

0
private void alarmEventInsert(DriveDetail driveDetail, String vehicleRegNo, int organizationId) {

    final String ALARM_EVENT_INS_SQL = "INSERT INTO alarm_event (event_code,param1,param2,org_id,created_time) VALUES (?,?,?,?,?)";
    CachedConnection conn = JDatabaseManager.getConnection();
    PreparedStatement ps = null;
    ResultSet generatedKeys = null;
    try {
        ps = conn.prepareStatement(ALARM_EVENT_INS_SQL, ps.RETURN_GENERATED_KEYS);
        ps.setInt(1, driveDetail.getEventCode());
        ps.setString(2, vehicleRegNo);
        ps.setString(3, null);
        ps.setInt(4, organizationId);
        ps.setString(5, driveDetail.getCreateTime());
        ps.execute();
        generatedKeys = ps.getGeneratedKeys();
        if (generatedKeys.next()) {
            driveDetail.setStopDuration(generatedKeys.getInt(1));
        }
    } catch (SQLException e) {
        e.printStackTrace();
        logger.error("Error inserting into alarm_event : {}", e
                .getMessage());
        logger.info(ps.toString());
    } finally {
        if (ps != null) {
            try {

                if (ps != null)
                    ps.close();
            } catch (SQLException e) {
                logger.error("Error closing prepared statements : {}", e
                        .getMessage());
            }
        }
    }
    JDatabaseManager.freeConnection(conn);
}

4
আপনার কি শেষ অবধি আপনার সংযোগটি মুক্ত করা উচিত নয়, এর বাইরে নয় (যদি আপনি কোনও ধরণের রানটাইম ব্যতিক্রম পেয়ে থাকেন তবে কোনও সংযোগ ফাঁস করবেন)?
জুলে

@ নীরাজ - পিএসআরএনটারি_জেইএনআরএটিএটিইকেইএস এর পরিবর্তে আমরা স্টেটমেন্ট লিখতে পারি REআর রিটার্ন_জেনের্যাট এ কেইইইসিএস কারণ এটি জাভা.এসকিউএল স্ট্যাটমেন্ট ক্লাসে স্থির পরিবর্তনশীল।
অমিতজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.