SELECT的Prepared语句返回0

时间:2016-05-03 07:54:47

标签: java sql

我创建了这个方法,使用他的名字从艺术家中选择id,但它返回0。

public int getIdArtist(){

    Conexion connection=new Conexion();
    ArtistVO artistVO=new ArtistVO();
    int id=0;

    try{
        String cSql="SELECT ArtistId from artist where Name=?";
        PreparedStatement sqlArtistId=connection.getConnection().prepareStatement(cSql);
        sqlArtistId.setString(1, artistVO.getNameArtist());
        ResultSet result=sqlArtistId.executeQuery();
        System.out.println(id); //debug
        while(result.next()){
            id=result.getInt("ArtistId");
        }
        return id;
    }catch(SQLException exception){
        exception.printStackTrace();
        return 0;
    }
}

我尝试过一些打印件来检查它失败的地方,并在executeQuery()之后立即失败;知道为什么会这样吗?

public class ArtistVO {

private int idArtist;
private String nameArtist;

public int getIdArtist(){
    return idArtist;
}

public void setIdArtist(int idArtist){
    this.idArtist=idArtist;
}

public String getNameArtist(){
    return nameArtist;
}

public void setNameArtist(String nameArtist){
    this.nombreArtist=nombreArtist;
}
}

这是我设置艺术家名称的代码的一部分,方法的其余部分无关紧要:

            String nameArtist=chooseArtist.getSelectedItem().toString();
            System.out.println(nameArtist); //debug
            artistVO.setNameArtist(nameArtist);

它取自Combobox的名称,并使用打印显示名称,显示,设置和获取名称不是问题。

#2:更新

此方法用于添加相册,sqlAddAlbum.setInt(3, getIdArtist());应该使用getIdArtist中给出的ID,但根据您的第一次更新,它以红色下划线,我不知道如何调整它:

    public void addAlbum(AlbumVO albumVO){

    Conexion connection=new Conexion();

    try{
        String cSql="INSERT into album values(?,?) where ArtistId=?";
        PreparedStatement sqlAddAlbum=connection.getConnection().prepareStatement(consultaSql);
        sqlAddAlbum.setInt(1, getMaxIdAlbum());
        sqlAddAlbum.setString(2, albumVO.getNameAlbum());
        sqlAddAlbum.setInt(3, getIdArtist());
        Integer affectedRows=sqlAddAlbum.executeUpdate();

        if(affectedRows>0){
            JOptionPane.showMessageDialog(null, "Album has been inserted","Information",JOptionPane.INFORMATION_MESSAGE);
        }else{
            JOptionPane.showMessageDialog(null, "Album has not been inserted", "Error", JOptionPane.ERROR_MESSAGE);
        }
        sqlAddAlbum.close();
        connection.closeConnection();
    }catch(SQLException exception){
        excepcion.printStackTrace();
        JOptionPane.showMessageDialog(null, "Album could not be added", "Error", JOptionPane.ERROR_MESSAGE);
    }

}

来自@Rafael Osipov的最新更新

     String nameArtist=chooseArtist.getSelectedItem().toString();
     int artistId = getIdArtist(nameArtist);
     System.out.println("artistId = " + artistId); 

我粘贴该代码以显示我如何从Combobox获取艺术家的名字,它不需要更改或调整,打印行是调试行,因此也不需要更改。

就像我说的那样问题出现在addAlbum()中,因为你对getIdArtist()做了第一次更改,它强调了对此方法的调用,我不知道如何解决它,我希望我现在能说清楚。

1 个答案:

答案 0 :(得分:0)

在线:

ArtistVO artistVO=new ArtistVO();

您正在按班级ArtistV0创建新对象。由于我们没有这个类的代码,我假设这个对象在里面是空的,并且在创建对象时没有设置艺术家名称。

致电时:

artistVO.getNameArtist()
在刚刚创建的对象上,你得到一个空字符串,你的sql看起来像这样:

SELECT ArtistId from artist where Name=''

当你执行你的sql时,你没有得到艺术家姓名为空的记录,因为你的artist表中没有这样的记录。

<强>更新

请查看您的getIdArtist()方法。即使您在此方法之外选择了艺术家姓名,也不要在此方法中使用此选定的艺术家姓名。您正在此方法内创建一个新对象,此对象具有空的艺术家名称。

外部和已填充的 ArtistVO对象作为参数传递给此方法并使用它:

public int getIdArtist(ArtistVO artistVO){

    Conexion connection=new Conexion();
    int id=0;

    try{
        String cSql="SELECT ArtistId from artist where Name=?";
        PreparedStatement sqlArtistId=connection.getConnection().prepareStatement(cSql);
        sqlArtistId.setString(1, artistVO.getNameArtist());
        ResultSet result=sqlArtistId.executeQuery();
        System.out.println(id); //debug
        while(result.next()){
            id=result.getInt("ArtistId");
        }
        return id;
    }catch(SQLException exception){
        exception.printStackTrace();
        return 0;
    }
}

<小时/> 更新#2

请注意,java语句区分大小写。我不确定chooseArtist.getSelectedItem()会返回什么,所以我再次更新了您的方法。

检查以下代码。

以新的方式声明getIdArtist()

public int getIdArtist(String artistName){

    Conexion connection=new Conexion();
    int id=0;

    try{
        String cSql="SELECT ArtistId from artist where Name=?";
        PreparedStatement sqlArtistId=connection.getConnection().prepareStatement(cSql);
        sqlArtistId.setString(1, artistName);
        ResultSet result=sqlArtistId.executeQuery();
        System.out.println(id); //debug
        while(result.next()){
            id=result.getInt("ArtistId");
        }
        return id;
    }catch(SQLException exception){
        exception.printStackTrace();
        return 0;
    }
}

在代码中使用此方法:

String nameArtist=chooseArtist.getSelectedItem().toString();
int artistId = getIdArtist(nameArtist);
System.out.println("artistId = " + artistId);