Как я могу получить правильный синтаксис при использовании executeQueryWithParameters для присоединения к оператору x ++ / sql в Microsoft Dynamics?
В настоящее время я просматриваю пример « Выполнение прямого оператора SQL » в Dynamics 365 for Finance and Operations Development Cookbook - Fourth Edition.
В тексте для заполнения
str sqlStatement
:
sqlStatement = 'SELECT %1, %2 FROM %3 ' +
'JOIN %4 ON %3.%5 = %4.%6 ' +
'WHERE %7 = %9 AND %8 = %10';
sqlStatement = strFmt(
sqlStatement,
fldAccountNum.name(DbBackend::Sql),
fldName.name(DbBackend::Sql),
tblVendTable.name(DbBackend::Sql),
tblDirPartyTable.name(DbBackend::Sql),
fldParty.name(DbBackend::Sql),
fldRecId.name(DbBackend::Sql),
fldDataAreaId.name(DbBackend::Sql),
fldBlocked.name(DbBackend::Sql),
sqlSystem.sqlLiteral(curext(), true),
sqlSystem.sqlLiteral(CustVendorBlocked::No, true));
который выполняется с
resultSet = statement.executeQuery(sqlStatement);
Однако Visual Studio предупреждает меня, что это устарело, поэтому я хотел бы заменить его, используя
statement.executeQueryWithParameters(sqlStatement, valueByKeyMap);
... конечно, для этого мне нужно создать карту, которая кажется менее простой, чем я ожидал.
В настоящее время я назначил это:
str sqlStatement = @'SELECT @accountNumberField, @nameField' +
' FROM @vendTable v' +
' JOIN @partyTable p' +
' ON (@vendTable.@partyField = @partyTable.@recId)' +
' WHERE (@dataAreaIdField = @dataArea)' +
' AND (@blockedField = @notBlocked)';
а затем заполнил карту следующим образом:
Map valueByKeyMap = SqlParams::create();
DictField accountNumberField = new DictField(tableNum(VendTable), fieldNum(VendTable, AccountNum));
valueByKeyMap.add('accountNumberField', accountNumberField.name(DbBackend::Sql));
DictField nameField = new DictField(tableNum(DirPartyTable), fieldNum(DirPartyTable, Name));
valueByKeyMap.add('nameField', nameField.name(DbBackend::Sql));
DictTable vendTableDictionary = new DictTable(tableNum(VendTable));
valueByKeyMap.add('vendTable', vendTableDictionary.name(DbBackend::Sql));
DictTable partyTableDictionary = new DictTable(tableNum(DirPartyTable));
valueByKeyMap.add('partyTable', partyTableDictionary.name(DbBackend::Sql));
DictField partyField = new DictField(tableNum(VendTable), fieldNum(VendTable, Party));
valueByKeyMap.add('partyField', partyField.name(DbBackend::Sql));
DictField recId = new DictField(tableNum(DirPartyTable), fieldNum(DirPartyTable, RecId));
valueByKeyMap.add('recId', recId.name(DbBackend::Sql));
DictField dataAreaIdField = new DictField(tableNum(VendTable), fieldNum(VendTable, DataAreaId));
valueByKeyMap.add('dataAreaIdField', dataAreaIdField.name(DbBackend::Sql));
DictField blockedField = new DictField(tableNum(VendTable), fieldNum(VendTable, Blocked));
valueByKeyMap.add('blockedField', blockedField.name(DbBackend::Sql));
valueByKeyMap.add('dataArea', curext());
valueByKeyMap.add('notBlocked', _sqlSystem.sqlLiteral(CustVendorBlocked::No, true));
Однако, когда код выполняется, я получаю
[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near '@partyField'.
Каков ожидаемый синтаксис и как это исправить?
1 ответ
Я не знаком с программированием динамики MS. Используя строковую интерполяцию С #, вроде
String accountNumberField = ...;
String nameField = ... ;
//... other variables for the string interpolation below
String statement =$"SELECT {accountNumberField}, {nameField}
FROM {vendTable} v
JOIN {partyTable} p
ON (v.{partyField} = p.{recId})
WHERE ({dataAreaIdField} = @dataArea)
AND ({blockedField} = @notBlocked)";
// Create and set values only Sql parameters `@dataArea` and `@notBlocked` with your tool here. Assotiate them with sqlStatement which text is statement
// ...
resultSet = statement.executeQuery(sqlStatement);