java - 从java调用过程时出现"The statement did not return a result set"

标签 java sql-server stored-procedures logic procedure

目前我正在从 SQL Server 调用一个过程。

这是我的方法:

@Override
    public String savePersonalData(PersonalDataDto personalDataDto) throws SQLException {
        String output = "";
        Connection conn = null;
        Statement sta = null;
        String errorClassAndMethod = getErrorContainingClassAndMethod();
        try {
            Gson gson = new GsonBuilder().create();
            String json = gson.toJson(personalDataDto);
            org.json.JSONObject jsonInput = new org.json.JSONObject(json);

            conn = createConnection(jsonInput);

            sta = conn.createStatement();
            String SPsql = "EXEC SP_UpdateAdvisoryBoxPersonalData ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?";

            PreparedStatement ps = conn.prepareStatement(SPsql);
            // ps.setEscapeProcessing(true);

            System.out.println(personalDataDto);

            ps.setString(1, personalDataDto.getClientId());
            ps.setString(2, personalDataDto.getDivisionId());
            ps.setString(3, personalDataDto.getClientRoleId());
            ps.setString(4, personalDataDto.getUserID());
            ps.setString(5, personalDataDto.getUserLoginDetailId());

            ps.setString(6, personalDataDto.getPersonalData().getAnv_Om_PlaatsGeboorte());
            ps.setString(7, personalDataDto.getPersonalData().getNaw_Om_Postcode());
            ps.setString(8, personalDataDto.getPersonalData().getNaw_Om_Voorletters());
            ps.setString(9, personalDataDto.getPersonalData().getNaw_Om_Naam());
            ps.setDate(10, personalDataDto.getPersonalData().getAnv_Dt_Geboorte());
            ps.setString(11, personalDataDto.getPersonalData().getAnv_Om_Email());
            ps.setString(12, personalDataDto.getPersonalData().getAnv_Om_TelefoonPrive());
            ps.setString(13, personalDataDto.getPersonalData().getAnv_Om_TelefoonWerk());
            ps.setString(14, personalDataDto.getPersonalData().getNaw_Om_Voornamen());
            ps.setString(15, personalDataDto.getPersonalData().getNaw_om_iban());
            ps.setString(16, personalDataDto.getPersonalData().getAnv_Om_LegitimatieAfgifte());
            ps.setInt(17, personalDataDto.getPersonalData().getNaw_Id());
            ps.setString(18, personalDataDto.getPersonalData().getNaw_Nr_Huis());
//          ps.setInt(19, personalDataDto.getPersonalData().getNaw_Id());
            ps.setString(19, personalDataDto.getPersonalData().getNaw_Om_Straat());

            ps.setString(20, personalDataDto.getPersonalData().getAnv_Om_TelefoonMobiel());
            ps.setString(21, personalDataDto.getPersonalData().getAnv_Cd_Nationaliteit());



            ResultSet rs = ps.executeQuery();

            /*boolean gotResults = ps.execute();
            ResultSet rs = null;
            if(!gotResults){
               System.out.println("No results returned");
            } else {
               rs = ps.getResultSet();
               System.out.println(rs.getMetaData());
            }*/

        } catch (Exception e) {
            e.printStackTrace();
            String errorMessageAndClassWithMethod = getErrorContainingClassAndMethod();
            throw new SpringAppRuntimeException(errorMessageAndClassWithMethod + e.toString());
        } finally {
            if (sta != null) {
                conn.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
        return output;
    }

我为此使用了两个不同的 DTO。 PersonalDataDto 就像:

public class PersonalDataDto {

    private String nawId;
    private String serverName;
    private String userName;
    private String password;
    private String databaseName;

    private String clientId;
    private String divisionId;
    private String clientRoleId;
    private String userID;
    private String userLoginDetailId;

    private PersonalDataInfoDto personalData;

// getters and setters for all

}

下一个是 PersonalDataInfoDto,它类似于:

public class PersonalDataInfoDto {

    private String anv_Om_TelefoonMobiel;

    private int naw_Id;

    private String anv_Om_TelefoonPrive;

    private String anv_Om_LegitimatieAfgifte;

    private int advisoryBoxContactRefID;

    private String naw_Om_Straat;

    private String naw_Om_Postcode;

    private String anv_Om_Email;

    private String naw_Nr_Huis;

    private String naw_Om_Voorletters;

    private String anv_Om_TelefoonWerk;

    private String naw_Om_Voornamen;

    private Date anv_Dt_Geboorte;

    private String naw_om_iban;

    private String anv_Om_PlaatsGeboorte;

    private String naw_Om_Naam;

    private String anv_Cd_Nationaliteit;

// getters and setters for all

}

错误是:

com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.

我应该在代码/输入中进行哪些更改才能从过程中获取结果集? 我是否需要像在方法中那样通过 java 调用它时在过程中添加一些内容?

最佳答案

注释掉 PRINT 语句,当您在数据库客户端中执行查询时,将返回一个表。

在您的存储过程中,有插入和更新语句。如果存储过程之前执行任何插入或更新 到最后的选择,JDBC(SQL Server 驱动程序)与行计数混淆(并且语句没有返回结果的异常 设置将被抛出)。

因此,您只需在存储过程的开头添加 SET NOCOUNT ON 即可。

关于java - 从java调用过程时出现"The statement did not return a result set",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46214932/

相关文章:

java - 我的初始值不是从1开始并且保持不变

javax.net.ssl.SSLException : Certificate for <> doesn't match any of the subject alternative names: [] 异常

sql - 如何在存储过程中生成新的Guid?

sql-server - 增加执行 SQL 查询 (V2) 操作中的 SQL 查询超时

在 Visual Studio 2012 中调试存储过程

sql-server - 行号获取

Java 在泛型中使用静态声明

Java多线程纠错——线程安全单例

sql-server - 从 T-SQL 中的点创建地理多边形

MySQL/Maria 构建 View 将缩写与完整描述相匹配