Bnas tardes amigos, tengo un pequeño problema cn base de datos q no inserta los datos en la tabla y me da un error :C, el me conecta bn mas no me agrega los datos a la tabla
aqui la clase main conexion
package controldeganado;
import controldeganado.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
*
* @author Administrador
*/
public class conexion {
private Connection conexion=null ;
/**
* Método utilizado para recuperar el valor del atributo conexion
* @return conexion contiene el estado de la conexión
*
*/
public Connection getConexion()
{
return conexion;
}
/**
* Método utilizado para establecer la conexión con la base de datos
* @return estado regresa el estado de la conexión, true si se estableció la conexión,
* falso en caso contrario
*/
public boolean crearConexion()
{
try {
Class.forName("org.postgresql.Driver");
conexion = DriverManager.getConnection("jdbc:postgresql://localhost:5432/Ganado","postgres","1993");
if(conexion!=null){
return true;
}
}
catch (SQLException ex) {
System.out.println("error en conexion: "+ex);
}
catch (ClassNotFoundException ex) {
System.out.println(ex);
}
return false;
}
/**
*
*Método utilizado para realizar las instrucciones: INSERT, DELETE y UPDATE
*@param sql Cadena que contiene la instrucción SQL a ejecutar
*@return estado regresa el estado de la ejecución, true(éxito) o false(error)
*
*/
public boolean ejecutarSQL(String sql)
{
try {
PreparedStatement sentencia = conexion.prepareStatement(sql);
sentencia.execute(sql);
return true;
} catch (SQLException ex) {
return false;
}
}
/**
*
*Método utilizado para realizar la instrucción SELECT
*@param sql Cadena que contiene la instrucción SQL a ejecutar
*@return resultado regresa los registros generados por la consulta
*
*/
public ResultSet ejecutarSQLSelect(String sql)
{
ResultSet resultado;
try {
PreparedStatement sentencia = conexion.prepareStatement(sql);
resultado = sentencia.executeQuery();
return resultado;
} catch (SQLException ex) {
System.err.println("Error "+ex);
return null;
}
}
}
class conexxion
public class conexxion {
public static conexion conexion = new conexion();
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
System.out.println("Conexion exitosa: "+ conexion.crearConexion());
if(conexion.crearConexion()){
//Form f = new Form();
aganado f= new aganado();
f.setVisible(true);
}
}
}
y el codoigo para agregar
private void btnAgregarActionPerformed(java.awt.event.ActionEvent evt) {
try{
String sql="INSERT INTO \"CGanado\"(c_practico, nombre, estado, raza, observacion, estatus, f_nacimiento, c_padre, c_madre, n_parto, c_peso) VALUES ('"+ txtCodigo.getText() +"','"+ txtNombre.getText() +"','"+ txtEstado.getText() +"','"+ txtRaza.getText() +"','"+ txtObser.getText() +"','"+ txtEstatus.getText() +"','"+ txtFecha.getText() +"','"+ txtP.getText() +"','"+ txtM.getText() +"','"+ txtNp.getText() +"','"+ txtPeso.getText() +"' )";
// ps.setInt(1,Integer.parseInt(jTextcedula.getText()));
PreparedStatement ps = con.getConexion().prepareStatement(sql);
// ps.setInt(1,Integer.parseInt(jTextcedula.getText()));
ps.setString(1,txtCodigo.getText());
ps.setString(2,txtEstado.getText());
ps.setString(3,txtEstatus.getText());
ps.setString(4,txtFecha.getText());
ps.setString(5,txtM.getText());
ps.setString(6,txtNombre.getText());
ps.setString(7,txtNp.getText());
ps.setString(8,txtObser.getText());
ps.setString(9,txtP.getText());
ps.setString(10,txtPeso.getText());
ps.setString(11,txtRaza.getText());
ps.setBinaryStream(12,fis,longitudBytes);
ps.execute();
JOptionPane.showMessageDialog(rootPane,"Guardado correctamente");
}catch(SQLException | NumberFormatException | HeadlessException x){
JOptionPane.showMessageDialog(rootPane, "exception 2 "+x);
}
}
Creo que no has entendido bien cómo se usa
PreparedStatement. Esta clase se usa para preparar una sentencia sin incluir los valores en ella, es decir. En tu caso, debería ser asi:
String sql = "INSERT INTO \"CGanado\" (c_practico, nombre, estado, " +
"raza, observacion, estatus, f_nacimiento, c_padre, c_madre, n_parto, c_peso)" +
"VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
try (
Connection con = Connection.getConnection();
PreparedStatement pst = con.preparedStatement(sql)) {
ps.setString(1, txtCodigo.getText());
ps.setString(2, txtEstado.getText());
ps.setString(3, txtEStatus.getText());
ps.setString(4, txtFecha.getText());
ps.setString(5, txtM.getText());
ps.setString(6, txtNombre.getText());
ps.setString(7, txtNp.getText());
ps.setString(8, txtObser.getText());
ps.setString(9, txtP.getText());
ps.setString(10, txtPeso.getText());
ps.setString(11, txtRaza.getText());
ps.execute();
} catch(SQLException e) {
e.printStackTrace();
}
Usas un
PreparedStatement siempre que primero deseas validar los datos que armarán la consulta, esto es muy importante por un tema de seguridad, porque si no validas los datos de entrada, tienes un 100% de posibilidades que te hagan un
SQLi con éxito de manera sencilla.
1. NO uses:
con.getConnection().prepareStatement
Porque de ésta forma no estás controlando el ciclo de vida de la conexión. Siempre obtén una conexión y al final ciérrala. En el caso que te he puesto, la conexión se cierra automáticamente porque estoy usando
try catch with resources una nueva característica de Java 7 que hace que los flujos y conexiones se cierren automáticamente.
2. ¿Cuál es el propósito de
setString(12, fis, longitudbytes)? Si solo especificas 11 columnas.
3. Las clases en Java,
SIEMPRE empiezan con mayúscula, siguen la nomenclatura PascalCasa o Upper camelCase.
4. Decir esto:
Citartengo un pequeño problema cn base de datos q no inserta los datos en la tabla y me da un error :C
Es equivalente a no de cir nada. Si quieres una ayuda concreta,
debes de ser específico en tu problema. Si tienes un error, ¿por qué no pegas el rasteo de pila (stack trace) para que podamos verlo?
Te recomiendo leas sobre buenas prácticas en Java y patrones de diseño, que puedes encontrar en este mismo foro y que te ayudarán muchísimo.
Saludos.
adicional a lo que se comenta en el post anterior puedes ps.execute() por ps.executeUpdate()
para hacer rastreo de pila puedes hacer
String error ="";
StackTraceElement[] st = excepcion.getStackTrace();
for (int ix = 0; ix < st.length; ix++) {
error = error + st[ix];
}
CitarSiempre obtén una conexión y al final ciérrala. En el caso que te he puesto, la conexión se cierra automáticamente porque estoy usando try catch with resources una nueva característica de Java 7 que hace que los flujos y conexiones se cierren automáticamente.
Interesante Gus Garsaky no conocia esta caracteristica, es decir en vez de hacer el bloque try/catch/finally el mismo try realiza el cierre de las conexiones vea pues
Así es, toda clase que implemente de forma directa o heredada la interface Autocloseable, se puede utilizar con try - catch with resources.