PDA

View Full Version : حذف یک رکورد در jtable



mohandesr
پنج شنبه 20 شهریور 1393, 13:43 عصر
با سلام
من می خوام از Jtable یک ردیف رو به دلخواه انتخاب کنم و اونو از پایگاه داده حذف کنم ، اطلاعاتم تو jtable قابل نمایشه ، حالا نمی دونم چجوری ای کارو بکنم البته کد زیر رو نوشتم ولی جواب نمی ده همچنین برای ویرایش یک سطر جدول و ذخیره اون تو پایگاه داده ؟

public void actionPerformed(ActionEvent e) {
int selectedRow = myproject.getSelectedRow(); int id = Integer.parseInt(myproject.getModel().getValueAt(s electedRow, 0 ).toString()); try
{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String dbURL = "jdbc:sqlserver://localhost:1433;databaseName=project;";
String user = "sa";
String pass = "12345";
Connection Connection = DriverManager.getConnection(dbURL,user, pass);
Statement sta = Connection.createStatement();
int ResultSet = sta.executeUpdate("delete from service where id = ?");
((PreparedStatement) sta).setInt(1, id);

}catch(SQLException | ClassNotFoundException ex){
System.out.println("exc");

}

}

});

vahid-p
دوشنبه 24 شهریور 1393, 08:04 صبح
اون کدی که برای واکشی از جدول نوشتم رو با اندکی تغییر میتونی برای حذف و اضافه کردن و... استفاده کنی. نیازی به ایجاد کلاس جدید نیست و کافیه، فقط متد هایی مثل add , delete رو مثل متد search بنویسی و فقط دستور SQL اش متفاوته. شماره ID برای اینکه بفهمی کدوم سطر رو حذف کنی هم به عنوان آرگومان برای متد delete بفرست. دوباره نمیخواد بیای و کانکشن ایجاد کنی.
همین!

mohandesr
دوشنبه 24 شهریور 1393, 12:03 عصر
سلام آقای وحید ممنون از راهنمایی های خوب و موثرتون ، من برای delete همونطور که شما گفتین عمل کردم ولی فقط نمی دونم چطور یک سطر خاص رو حذف کنم میشه بیشتر راهنمایی کنید اگه برام این تیکشو درست کنین ممنون میشم.

public ResultSet delete(int parseInt) {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String dbURL = "jdbc:sqlserver://localhost:1433;databaseName=project;";
String user = "sa";
String pass = "12345";
Connection = DriverManager.getConnection(dbURL,user, pass);
System.out.println("project");
Statement sta = Connection.createStatement();
ResultSet = sta.executeQuery("delete FROM service where id='?'");

} catch (SQLException | ClassNotFoundException ex) {
System.out.println("exc");

}


---------------------------------------------------


deleteBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int row;
try {
ResultSet resultSet = util.delete(Integer.parseInt(id.getText()));
if (resultSet != null) {
showResult(resultSet);
}else{
System.out.println("ResultSet is null");
}
} catch (NumberFormatException ex) {
return;

vahid-p
دوشنبه 24 شهریور 1393, 18:20 عصر
خب متد delete که باز به کلاس DatabaseUtil باید اضافه بشه، میتونه چنین چیزی باشه ( حالا در نظر گرفتن استثنا و... به کنار ) :
public boolean delete(int ID) {
try {
database.getConnection().prepareStatement("DELETE FROM `service` WHERE id = "+ID).execute();
return true;
} catch (SQLException ex) {
return false;
}
}

و همون کدی که دادم و گفتم که برای هر متدی مثل search , delete ,... نیازی نیست دوباره connection برقرار کنی. البته میتونی مثلا اگر عملیات حذف و اضافه و واکشی زیاد نیست هر بار اینکار رو انجام بدی، ولی لا اقل یه متد فقط برای اتصالش بنویس تا متد هات طولانی و شلوغ نشه.
خب از طرفی در کلاس MyTable هم اینو اضافه کن :
deleteBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
if(util.delete((int) table.getValueAt( table.getSelectedRow(),0))){
searchBtn.doClick(); // برای رفرش کردن لیست پس از حذفیات
}else{
JOptionPane.showMessageDialog(rootPane, "Error! Deleting the row was unsuccessful");
}
}
});

mohandesr
دوشنبه 24 شهریور 1393, 22:56 عصر
خوب آقای وحید اینا درست ولی چجوری ردیف مورد نظر رو انتخاب کنیم ، مشکل من اینه که بعد از واکشی که اطلاعات تو جدول میاد حالا می خوام با ماوس برم روی یکی از ردیف ها و اونو انتخاب کنم و بعد حذفش کنم ؟

vahid-p
سه شنبه 25 شهریور 1393, 07:16 صبح
من همینکار رو کردم که میگید. شما کد رو بخونید متوجه میشید.
نوشتم :
table.getSelectedRow()
که شماره سطر انتخاب شده جدول رو نشون میده. بعدش هم :
table.getValueAt( table.getSelectedRow(),0)
که اون سطر انتخاب شده ( شاید هم چیزی انتخاب نشده، یا قابلیت انتخاب همزمان چند تا سطر رو داشته باشه که باید این موارد رو چک کنید که برنامه با مشکل رو برو نشه )، مقدار ستون اولش که ID هست رو میگیره و به عنوان آرگومان متد delete میفرسته. بعد اگر عملیات موفقیت آمیز بود، متد delete مقدار true رو برمیگردونه پس search.doClick انجام میشه، اگر هم مقدار false رو برگردوند، یعنی مشکل داشت عملیات و اررور میده.

mohandesr
سه شنبه 25 شهریور 1393, 10:56 صبح
نه آقای وحید این تکه کدی که شما میگید برای انتخاب سطر هستش کلا با بقیه برنامه ناسازگاره ، چون این از نوع boolean هستش و بقیه از نوع resultset ، یه تیکه رو درست می کنی بقیه مشکل دار میشه ، راه دیگه ای نیست ؟؟؟؟؟؟؟؟؟

vahid-p
سه شنبه 25 شهریور 1393, 14:20 عصر
چی بقیه مشکل دار میشه؟!!! من دقیقا همون برنامه که search داشت، الان delete رو هم بهش اضافه کردم، بدون هیچ مشکلی. خب یه متد دوست داری boolean بده، یه متد مثل search بهت ResultSet میده. متوجه منظورتون نمیشم از اینکه بقیه ResultSet میده و متد delete اگه boolean باشه مشکل ساز میشه.

کلا چیزی که گفتید خیلی مبهم بود. بگید مشکل کدی که نوشتم چیه، و چرا بقیه رو دچار مشکل میکنه؟!

mohandesr
سه شنبه 25 شهریور 1393, 20:40 عصر
ببینید این کل برنامه ها و کلاس ها ، یادتونه دفعه پیش بهتون گفتم return رو که null گذاشته بودین search اجرا نمی شد من جلو return رو resultset گذاشتم درست شد حالا که این تیکه کد رو به delete اضافه می کنم میگه باید resultset بولین بشه بعد که این کار رو انجام میدم همه خطا دار میشه ، حالا کدهارو گذاشتم اینا به غیر از delete و updateدرست کار میکنه شما اضافه کنین ببینین مشکلش چیه ؟
این کلاس اصلی:


import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.FlowLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.AbstractButton;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import project.Insert;
import project.MyTabl;
import project.ServicesDefine;
public class myproject extends JFrame {

private static Connection Connection;
private DatabaseUtil util;
private JTextField id;
private JButton searchBtn;
private JButton deleteBtn;
private JButton ADDBtn;
private JButton UpdateBtn;
private JButton ExitBtn;
private JTable table;
private DefaultTableModel tableModel;
private JPanel contentPane;
private MyDatabase database;
protected AbstractButton tb_records;
protected static DefaultTableModel model;

public myproject() {
super("myproject");

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);


util = new DatabaseUtil(database);
initialize();
}
private void initialize() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(700, 700);
setResizable(false);
setLayout(new FlowLayout());
id = new JTextField(10);
searchBtn = new JButton("Search");
deleteBtn = new JButton("delete");
ADDBtn = new JButton("ADD");
UpdateBtn=new JButton("Update");
ExitBtn=new JButton("Exit");
tableModel = new DefaultTableModel(0,6);
table = new JTable();
table.setModel(tableModel);
JScrollPane pane = new JScrollPane(table);
add(id);
add(searchBtn);
add(deleteBtn);
add(ADDBtn);
add(UpdateBtn);
add(ExitBtn);
add(pane);
UpdateBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {


try {
ResultSet resultSet = util.update(Integer.parseInt(id.getText()));
if (resultSet != null) {
showResult(resultSet);
}else{
System.out.println("ResultSet is null");
}
} catch (NumberFormatException ex) {
return;
}
}




});

deleteBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {


try {

ResultSet resultSet = util.delete(Integer.parseInt(id.getText()));
if (resultSet != null) {
showResult(resultSet);
}else{
System.out.println("ResultSet is null");
}
} catch (NumberFormatException ex) {
return;
}
}




});

ADDBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Insert window = new Insert();
window.open();
} catch (Exception e1) {
e1.printStackTrace();
}
}


});

ExitBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
dispose();
}

});
searchBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(id.getText());
try {
ResultSet resultSet = util.search(Integer.parseInt(id.getText()));
if (resultSet != null) {
showResult(resultSet);
}else{
System.out.println("ResultSet is null");
}
} catch (NumberFormatException ex) {
return;
}
}
});
}

protected static int getSelectedRow() {
model.addColumn("Column");
for (int i = 0; i < 100; i++) {
model.addRow(new Object[]{i});
// TODO Auto-generated method stub
return 0;}
return 0;
}
private void showResult(ResultSet resultSet) {
tableModel=new DefaultTableModel(0,6);
table.setModel(tableModel);
try {
while (resultSet.next()) {
tableModel.insertRow(table.getRowCount(), new Object[]{
resultSet.getObject(1),
resultSet.getObject(2),
resultSet.getObject(3),
resultSet.getObject(4),
resultSet.getObject(5),
resultSet.getObject(6),
});
} } catch (SQLException ex) {
JOptionPane.showMessageDialog(rootPane, "Error in SQL");
}
}

public static void main(String[] args) throws SQLException, ClassNotFoundException {
MyDatabase database;

try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String dbURL = "jdbc:sqlserver://localhost:1433;databaseName=project;";
String user = "sa";
String pass = "12345";
Connection = DriverManager.getConnection(dbURL,user, pass);


} catch (Exception ex) {
System.out.println("Error in database connection or driver");

}

EventQueue.invokeLater(new Runnable() {
public void run() {
try {
myproject frame = new myproject();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}}
});
}
public void SetVisible(boolean b) {
try {
myproject window = new myproject();
window.open(); }
catch (Exception e) {
e.printStackTrace();
}
// TODO Auto-generated method stub

}
private void open() {
myproject anotherFrame = new myproject();
anotherFrame.pack();
anotherFrame.setVisible(true);
// TODO Auto-generated method stub

}


}


این کلاس database
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class MyDatabase {
private String databaseName;



public MyDatabase(String[] args) throws ClassNotFoundException, SQLException {
this.databaseName = databaseName;

try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String dbURL = "jdbc:sqlserver://localhost:1433;databaseName=project;";
String user = "sa";
String pass = "12345";
Connection Connection = DriverManager.getConnection(dbURL,user, pass);
System.out.println("project");
Statement sta = Connection.createStatement();
} catch (ClassNotFoundException | SQLException ex) {
throw ex; }

}



public Connection getConnection() {
return getConnection();
}

public String getDatabaseName() {
return databaseName;
}

public void close() throws SQLException{

MyDatabase con = null;
con.close();
}
}


و اینم کلاس util :
import java.sql.*;
public class DatabaseUtil {

private final MyDatabase database;
private Connection Connection;
private java.sql.ResultSet ResultSet;


public DatabaseUtil(MyDatabase database) {
this.database = database;
}

public java.sql.ResultSet search(int id) {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String dbURL = "jdbc:sqlserver://localhost:1433;databaseName=project;";
String user = "sa";
String pass = "12345";
Connection = DriverManager.getConnection(dbURL,user, pass);
System.out.println("project");
Statement sta = Connection.createStatement();
ResultSet = sta.executeQuery("SELECT * FROM service");

} catch (SQLException | ClassNotFoundException ex) {
System.out.println("exc");

}
return ResultSet;}
public java.sql.ResultSet delete(int parseInt) {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String dbURL = "jdbc:sqlserver://localhost:1433;databaseName=project;";
String user = "sa";
String pass = "12345";
Connection = DriverManager.getConnection(dbURL,user, pass);
System.out.println("project");
Statement sta = Connection.createStatement();

ResultSet = sta.executeQuery("delete FROM service where id=1");

} catch (SQLException | ClassNotFoundException ex) {
System.out.println("exc");

}

// TODO Auto-generated method stub
return ResultSet;
}
public java.sql.ResultSet update(int parseInt) {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String dbURL = "jdbc:sqlserver://localhost:1433;databaseName=project;";
String user = "sa";
String pass = "12345";
Connection = DriverManager.getConnection(dbURL,user, pass);
System.out.println("project");
Statement sta = Connection.createStatement();

ResultSet = sta.executeQuery("update service set id=1");

} catch (SQLException | ClassNotFoundException ex) {
System.out.println("exc");

}

// TODO Auto-generated method stub
return ResultSet;
}}

vahid-p
پنج شنبه 27 شهریور 1393, 14:34 عصر
وقتی کانکشن close نشده نیازی نیست در هر متد دوباره کانکشن برقرار کنید. مگر اینکه یک متد برای اتصال و یکی هم برای بستنش بنویسید و کانکشن رو اول و آخر هر متد ایجاد کنه و ببنده. اینطوری برای هر متد مثل search داریم :

connect();

// to do

close();


از این ها بگذریم، متاسفانه فرصت چک کردن کد شما رو ندارم، ولی در عوض کد های خودم رو میذارم تا اینجای کار. به نظرم بهتره مفهوم و کارکردش رو یادبگیرید، وگرنه تو هر قدم با مشکل مواجه میشید.
1- MyDatabase که نیاز به تغییر دادنش نیست.
2- MyTable

import java.awt.FlowLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

public class MyTable extends JFrame {

private DatabaseUtil util;

private JTextField idField;
private JButton searchBtn;
private JButton deleteBtn;
private JTable table;
private DefaultTableModel tableModel;

public MyTable(MyDatabase database) throws HeadlessException {
super("TEST");
util = new DatabaseUtil(database);
initialize();
}

public void initialize() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(500, 500);
setResizable(false);
setLayout(new FlowLayout());

idField = new JTextField(10);
searchBtn = new JButton("Search");
deleteBtn=new JButton("Delete");
tableModel = new DefaultTableModel(0,3);
table = new JTable();
table.setModel(tableModel);
JScrollPane pane = new JScrollPane(table);

add(idField);
add(searchBtn);
add(deleteBtn);
add(pane);

searchBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
System.out.println(idField.getText());
try {
ResultSet resultSet = util.search(Integer.parseInt(idField.getText()));
if (resultSet != null) {
showResult(resultSet);
}else{
System.out.println("ResultSet is null");
}
} catch (NumberFormatException ex) {
return;
}
}
});
deleteBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
if(util.delete((int) table.getValueAt( table.getSelectedRow(),0))){
searchBtn.doClick();
}else{
JOptionPane.showMessageDialog(rootPane, "Error! Deleting the row was unsuccessful");
}
}
});
}

public void showResult(ResultSet resultSet) {
tableModel=new DefaultTableModel(0,3);
table.setModel(tableModel);
try {
while (resultSet.next()) {
tableModel.insertRow(table.getRowCount(), new Object[]{
resultSet.getObject(1),
resultSet.getObject(2),
resultSet.getObject(3)});
}
} catch (SQLException ex) {
JOptionPane.showMessageDialog(rootPane, "Error in SQL");
}
}

public static void main(String[] args) {
MyDatabase database;
try {
database = new MyDatabase("hostname", "dbname", "user", "pass"); //این اطلاعات رو بسته به دیتابیستون تغییر بدید
new MyTable(database).setVisible(true);
} catch (Exception ex) {
System.out.println("Error in database connection or driver");
}
}
}



3- DatabaseUtil

import java.sql.ResultSet;
import java.sql.SQLException;

public class DatabaseUtil {

private final MyDatabase database;

public DatabaseUtil(MyDatabase database) {
this.database = database;
}

public ResultSet search(int ID) {
try {
return database.getConnection().prepareStatement("SELECT * FROM `tablename` LIMIT " + ID + " , 10").executeQuery(); //اسم جدول رو بنویس
} catch (SQLException ex) {
System.out.println("exc");
return null;
}
}

public boolean delete(int ID) {
try {
database.getConnection().prepareStatement("DELETE FROM `tablename` WHERE id = "+ID).execute(); //اسم جدول رو بنویس
return true;
} catch (SQLException ex) {
return false;
}
}
}

mohandesr
پنج شنبه 27 شهریور 1393, 19:12 عصر
بازم سلام آقای وحید شما با پاسخاتون واقعا منو شرمنده کردین ، شما گفته بودین این تیکه کد ( انتخاب ردیف ) رو به اون کد واکشی که گفته بودین اضافه کنم درحالیکه شما اصلا اون کد رو کلا برداشتین ، من قبلا به اون اضافه می کردم که اون خطا ها رو میداد، حالامنم همین کار رو کردم چیزی که جالبه اینه که سطر رو که انتخاب می کنم و دکمه حذف رو می زنم قسمت else کد رو ( بخش error ) رو اجرا می کنه و در عین حال ردیف مورد نظر رو حذف هم می کنه (نمی دونم چرا ). با کمال شرمندگی میشه کد update رو هم بزارین من همین کارو که برای delete انجام دادم برای update هم انجام دادم ولی جواب نمی ده ، و یه سوال دیگه اینکه من از داخل یک فرم که یک فرم دیگه رو باز می کنم وقتی می خوام فرم دوم رو با دکمه exit ببندم هر دو فرم بسته می شه چیکار کنم که فقط همین فرم دومم بسته شه ، از کد setVisible(false) و dispose() استفاده کردم ، البته این فرمم swt هستش و فرم اولی swing ، خیلی خیلی ازتون ممنونم !!!!!!!!!!!

vahid-p
جمعه 28 شهریور 1393, 01:58 صبح
ببینید بقیه هم مثل همینه. یکم با سعی و خطا انجام بدید. کافیه فقط دستور SQL اش رو تغییر بدید همین! ( برای آشنایی با syntax دستورات sql به لینک های روبرو مراجعه کن : http://www.w3schools.com/sql/sql_update.asp و http://www.tutorialspoint.com/sql/sql-update-query.htm )

و کد های زیادی تو اینترنت هست که کافیه مثلا عبارت های مثل sql update query in java و از این دست رو جستجو کنید.

در مورد بستن پنجره هم در Swing کافیه به جای خط 32 کلاس MyTable که setDefaultCloseOperation(EXIT_ON_CLOSE) است بنویسید :
setDefaultCloseOperation(DISPOSE_ON_CLOSE);

mohandesr
شنبه 29 شهریور 1393, 10:33 صبح
سلام آقای وحید ، فرمایش شما متین ولی من هر دستور update ای که گذاشتم جواب نمی ده ، یک فیلد خاص رو که بهش می دی آپدیت می کنه ولی اینکه یک فیلد دلخواه تو یک ردیف رو نه ، شما پیشنهادی ندارین ؟