Вызываемый оператор JDBC выполняется локально, но «Значение не установлено для параметра номер 2» при запуске в Jenkins - PullRequest
0 голосов
/ 26 февраля 2019

Я использую jdbc.SQLServerDriver в проекте Java Maven для вставки записей теста в базу данных отчетов о тестировании.Когда я запускаю тест локально либо через Intellij, либо с помощью «mvn clean compile», «mvn test» в Powershell, записи успешно вставляются в базу данных.Однако, когда я запускаю Jenkins (декларативный конвейер), я получаю следующее сообщение об ошибке: com.microsoft.sqlserver.jdbc.SQLServerException: значение для параметра № 2 не установлено.

Я посмотрел нанесколько ресурсов вокруг CallableStatement и несколько сообщений StackOverflow о сообщении об ошибке, но я не понимаю, почему параметр будет установлен при локальном запуске, а не в Jenkins.

Вот мой файл Jenkinsfile:

pipeline {
    agent any
    stages {
        stage('Compile') {
            steps {
                withMaven(maven: 'LocalMaven'){
                    bat 'mvn clean compile'
                }
            }
        }
        stage('Test') {
            steps {
                withMaven(maven: 'LocalMaven'){
                    bat 'mvn test'
                }
            }
        }
    }
}

Вот мой код для выполнения сохраненного процесса:

public static void ExecuteStoredProc(String procedureName, Hashtable parameters, Connection connection)
{

    try {
        String paraAppender;
        StringBuilder builder = new StringBuilder();
        // Build the paramters list to be passed in the stored proc
        for (int i = 0; i < parameters.size(); i++) {
            builder.append("?,");
        }

        paraAppender = builder.toString();
        paraAppender = paraAppender.substring(0,
                paraAppender.length() - 1);

        CallableStatement stmt = connection.prepareCall("{Call "
                + procedureName + "(" + paraAppender + ")}");

        // Creates Enumeration for getting the keys for the parameters
        Enumeration params = parameters.keys();

        // Iterate in all the Elements till there is no keys
        while (params.hasMoreElements()) {
            // Get the Key from the parameters
            String paramsName = (String) params.nextElement();
            // Set Paramters name and Value
            stmt.setString(paramsName, parameters.get(paramsName)
                    .toString());
        }

        // Execute Query
        stmt.execute();
    } catch (Exception e) {
        System.out.println(procedureName);
        System.out.println(parameters.keySet());
        System.out.println(e.getMessage());

    }
}

}

Вот значения, которые я передаю в Hashtable:

public static void CreateRun(Connection connection)
{

    //Params
    Hashtable table = new Hashtable();
    table.put("Machine", "Machine");
    table.put("ClientOS", "CLientOS");
    table.put("Environment", "Environment");
    table.put("Browser", "Browser");
    table.put("BrowserVersion", "BrowserVersion");
    table.put("RunBuild", "RunBuild");
    table.put("DevMachine", "1");
    table.put("ExpectedCases", "1");

    DatabaseUtil.ExecuteStoredProc("sp_CreateRun",table, connection );

}

А вот и сохраненный процесс:

... PROC [dbo].[sp_CreateRun]
@Machine varchar(45),
@ClientOS     varchar(45),
@Environment varchar(45),
@Browser varchar(45),
@BrowserVersion varchar(45),
@RunBuild varchar(45),
@DevMachine bit,
@ExpectedCases int

AS
BEGIN
    INSERT into Run (Start_Time, End_Time, Machine, Client_OS, Environment, Browser, Browser_Version, Run_Build, Dev_Machine, Expected_Cases)
     values (GETDATE(),GetDate(),@Machine,@ClientOS,@Environment,@Browser, @BrowserVersion,@RunBuild,@DevMachine,@ExpectedCases)
END

Заранее спасибо за просмотр.

1 Ответ

0 голосов
/ 28 февраля 2019

Спасибо всем за полезные комментарии.Я никогда не понимал, как заставить это работать с CallableStatement, но я действительно работал как локально, так и на Jenkins, используя Spring SimpleJdbcCall.Мне действительно нравится, насколько чище код сейчас.

public static void ExecuteStoredProc(String procedureName, Map<String, String> parameters)
{
    JdbcTemplate template = new JdbcTemplate(SpringJDBCConfig.sqlDataSource());

    MapSqlParameterSource sqlParameterSource = new MapSqlParameterSource();

    for (String key : parameters.keySet()) {
        sqlParameterSource.addValue(key, parameters.get(key));
    }

    SimpleJdbcCall call = new SimpleJdbcCall(template)
            .withCatalogName("matrix")
            .withSchemaName("dbo")
            .withProcedureName(procedureName);

   call.execute(sqlParameterSource);
}
...