Хотя я не могу говорить о синтаксисе самих запросов DB2, поэтому я полагаюсь на ваше утверждение, что сам запрос должен работать ...
То, что у вас есть в C #, это просто строка и ничего более:
private const string DB2Query = @"SELECT Name as Name FROM {Schema}.Application WHERE ID = ?";
Обратите внимание, что в этом определении строки нет необходимости в операторе @
, поэтому давайте упростим:
private const string DB2Query = "SELECT Name as Name FROM {Schema}.Application WHERE ID = ?";
Хотя эта строка выглядит интуитивно 1013 *, чтобы иметь заполнитель, который можно заменить значением, если нет кода, который делает это где-либо, то этого не произойдет. Для этого у вас есть несколько вариантов. Например, вы можете использовать заполнитель, который string.Format()
понимает:
private const string DB2Query = "SELECT Name as Name FROM {0}.Application WHERE ID = ?";
А потом где-нибудь в методе, когда вы хотите использовать эту строку, примените к ней значение формата:
var sql = string.Format(DB2Query, someVariable);
В этом случае someVariable
(который даже не должен быть переменной и может быть строковым литералом) будет использоваться для замены заполнителя в строке.
<ч />
Или, если вы хотите сохранить именованный заполнитель, вы можете заменить его вручную:
private const string DB2Query = "SELECT Name as Name FROM {Schema}.Application WHERE ID = ?";
и позже в методе:
var sql = DB2Query.Replace("{Schema}", someVariable);
Это, очевидно, позволит выполнить то же самое, возможно, с очень незначительной разницей в производительности.
<ч />
Вы также можете воспользоваться обоими подходами, используя более позднюю языковую функцию интерполяции строк. Это будет использовать оператор $
для непосредственного применения заполнителей формата. Я не думаю, что вы можете использовать это в const
, это больше для локальной переменной. Примерно так:
var sql = $"SELECT Name as Name FROM {someVariable}.Application WHERE ID = ?";
Это все равно выполнит ту же замену, поместив someVariable
там, где находится заполнитель, он просто использует более краткий синтаксис, чем вызов string.Format()
. Об этом синтаксисе следует отметить то, что он выглядит так, как будто эта интерполяция происходит непосредственно в строке. Это все еще многоэтапный процесс за кулисами, поэтому он, скорее всего, вообще не будет работать с const
или с членами класса (и я должен представить, что выдает ошибку компилятора).
Помните, что строки неизменны , поэтому любая выполняемая вами операция, которая изменяет строку, будет возвращать новую строку вместо изменения существующей на месте .
<ч />
В любом случае вам, конечно, также необходимо применить параметр запроса для заполнителя ?
. Обратите внимание, что то, что C # считает заполнителем в операции форматирования / интерполяции строк, и то, что DB2 считает заполнителем параметра запроса, - это две совершенно разные вещи, которые происходят в разное время в разных средах. (Один во время выполнения .NET, другой во время выполнения запроса сервера базы данных.) Но опять же, я полагаюсь на ваше утверждение, что сам запрос к базе данных работает, и единственная проблема, на которой мы сосредоточиваем внимание, это заполнитель строки C #.