Как вернуть более одной строки из базы данных HANA с помощью XS?

Я пытаюсь извлечь все данные из таблицы базы данных в объект json, например так:

function getTableData()
{
    var vals = {};
    var data = [];
    try {
    var dbCon = $.db.getConnection();

    var query = 'SELECT * FROM SAPPRD.ZUSERDATATAB';
    var pstmt = dbCon.prepareStatement(query);
    var rs = {};
    rs = pstmt.executeQuery();

     while (rs.next()) {
        vals.team = rs.getString(1);
        vals.fname  = rs.getString(3);
        vals.lname = rs.getString(2);
        data.push(vals);
        $.response.status = $.net.http.OK;
     }

 $.response.setBody(JSON.stringify(data));
  //      $.response.contentType = contentType;
  //      $.response.headers.set('Content-Disposition', 'filename=' + filename);
} catch (e) {
    $.response.setBody('errors: ' + e.message);
}
}

Запрос работает только частично, потому что в данных я получаю количество строк x содержимое последней строки, например:

[{"team":"I313766","fname":"0","lname":"LEGOWSKI"},  
 {"team":"I313766","fname":"0","lname":"LEGOWSKI"},
  etc. etc.]

Как мне заставить его получать все данные вместо одного ряда раз?

2 ответа

Решение

Хорошо, я получил решение. Перемещение одной строки, объявляющей значения массива в оператор while, решило проблему - значения массива каждый раз инициализировались как пустой массив, что позволяло получать правильный.push каждой строки вместо того, чтобы вставлять последнюю строку из таблицы db в данные несколько раз. Спасибо всем, кто нашел время и попытался ответить.

function getTableData()
{

     var data = [];
    try {
        var dbCon = $.db.getConnection();

        var query = 'SELECT * FROM SAPPRD.ZUSERDATATAB';
        var pstmt = dbCon.prepareStatement(query);
        var rs = pstmt.executeQuery();

         while (rs.next()) {
            var vals = {}; // this is the moved line of code...
            vals.team = rs.getString(1);
            vals.fname  = rs.getString(3);
            vals.lname = rs.getString(2);
            data.push(vals);
            $.response.status = $.net.http.OK;
         }

 $.response.setBody(JSON.stringify(data));
  //      $.response.contentType = contentType;
  //      $.response.headers.set('Content-Disposition', 'filename=' + filename);

    } catch (e) {
        $.response.setBody('errors: ' + e.message);
    }
}

Решение выше на случай, если кому-то понадобится это в будущем.

Это XSJS(JS на стороне сервера), а не SAPUI5. Чтение БД очень похоже на JDBC-инфраструктуру в Java для чтения таблиц БД, и в наборе результирующих наборов будут данные, и вы перебираете их и перемещаете в локальный объект. Во время execute_query есть только вызов БД, а rs.next() - просто цикл для чтения каждой строки.

Другие вопросы по тегам