2016-01-05 3 views
1

Операторы выбора работают нормально, но всякий раз, когда я пытаюсь вставить или обновить набор записей, а затронутые значения не определены. Вставка/обновление работает в БД, я просто не могу прочитать возвращаемые значения.node-mssql insert return undefined recordset

var sql = require('mssql'); 
var config = {...}; 

sql.connect(config).then(function() { 
    new sql.Request().query("INSERT INTO MyTable (Name, Age) VALUES ('John', 30)").then(function(recordset, affected) { 
    console.log('Recordset: ' + recordset); 
    console.log('Affected: ' + affected); 
    }).catch(function(err) { 
    console.log('Request error: ' + err); 
    }); 
}).catch(function(err) { 
    if (err) { 
    console.log('SQL Connection Error: ' + err); 
    } 
}); 

Вывод на консоль:

Recordset: undefined 
Affected: undefined 

Я чувствую, что я должен быть отсутствующий что-то действительно просто здесь.

+0

Я ничего не знаю о js, но: инструкция 'INSERT' не возвращает набор записей. Может быть, это проливает свет на вашу проблему? –

+0

Возможно, вам нужно добавить предложение OUTPUT в команду INSERT. –

ответ

3

Как указано в комментариях, оператор INSERT не возвращает набор записей, поэтому recordset не определен. Обратитесь к документации this section, чтобы узнать больше о том, как получить количество затронутых строк.

Проблема с вашим кодом заключается в том, что вы ожидаете, что affected является вторым аргументом из обещания, но обещания поддерживают только один аргумент. Из-за этого вы должны обращаться к числу затронутых строк таким образом:

var sql = require('mssql'); 
var config = {...}; 

sql.connect(config).then(function() { 
    var request = new sql.Request(); 
    request.query("INSERT INTO MyTable (Name, Age) VALUES ('John', 30)").then(function(recordset) { 
    console.log('Recordset: ' + recordset); 
    console.log('Affected: ' + request.rowsAffected); 
    }).catch(function(err) { 
    console.log('Request error: ' + err); 
    }); 
}).catch(function(err) { 
    if (err) { 
    console.log('SQL Connection Error: ' + err); 
    } 
}); 
+0

Спасибо за ваш ответ! Это имеет смысл, но я предполагаю, что в конечном итоге я получаю значение столбца идентификатора из недавно вставленной строки. Каков наилучший способ получить это? – solydest

+1

Измените команду TSQL на: 'INSERT INTO MyTable (имя, возраст) VALUES ('John', 30); SELECT @@ IDENTITY AS ID' –

+0

Возможно, лучше использовать' SCOPE_IDENTITY() ', а не' @@ IDENTITY'. Будет ли '@@ IDENTITY' работать в условиях гонки, если в то же время происходит много событий INSERT INTO?? –