DB2 Dynami c sql, переменные, возвращающие скалярное значение - PullRequest
0 голосов
/ 05 мая 2020

У меня есть таблица с:

ID (int, generated) OriginalID (int, nullable) ... other columns.

При вставке записи я хотел бы установить «OriginalID» на «ID», который был сгенерирован. В настоящее время сценарий выглядит так:

BEGIN ATOMIC DECLARE i INT; SET i = SELECT ID FROM NEW TABLE(INSERT INTO MyTable(...) VALUES (....)); UPDATE MyTable SET ORIGINALID=i WHERE ID=i; END

теперь у меня есть проблема, как вернуть «i», чтобы получить значение в коде, при вызове метода ExecuteScalar?

Я уже пробовал «SELECT i FROM SYSIBM.SYSDUMMY1», «VALUES (i)» - оба оператора возвращают «null» в коде.

Я получаю значение, если вызываю ExecuteScalar с таким сценарием: SELECT ID FROM NEW TABLE(INSERT INTO MyTable(...) VALUES (....));

Запрос выполняется из кода c# (. net core / IBM.Data.DB2.Core 1.2.2.100) с использованием DB2Connection и DB2Command:

var query = ...;
var connection = new DB2Connection(conn_string);
var command = new DB2Command(connection, query);
command.parameters.Add(...);
var returnValue = command.ExecuteScalar(); << the value here is always 
null if trying to return the db2 variable; it works only if executing 
"single statement" 

**** edit ****

Получил работу с помощью Марка Баринштейна:

последний оператор в запросе теперь: "set @newId = я;" и в коде:

var newId = new DB2Parameter("@newId", DB2Type.Integer);
newId.Direction = System.Data.ParameterDirection.Output;
command.Parameters.Add(newId);
command.ExecuteNonQuery();
var id = newId.Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...