ОШИБКА [37000] [IBM] [Драйвер CLI] CLI0118E Неверный синтаксис SQL. SQLSTATE = 37000 - PullRequest
0 голосов
/ 14 января 2019

У меня есть простой запрос оператора SQL, который выполняется как команда из кода C #. Он нацелен на DB2. Я создал переменные для сервера / схемы следующим образом. Выдает ошибку.

private const string DB2Query
            = @"SELECT Name as Name FROM {Schema}.Application WHERE ID = ?";

Я получаю эту ошибку.

ОШИБКА [37000] [IBM] [Драйвер CLI] CLI0118E Неверный синтаксис SQL. SQLSTATE = 37000

Тем не менее, я не получаю эту ошибку при выполнении из SQL следующим образом:

SELECT Name as Name 
FROM MyServer..FOR3.Application 
WHERE ID = 'MOM'

Чтобы поддержать это, я попытался сделать что-то вроде ниже в коде, все еще выдает другую ошибку.

 private const string DB2Query
                    = @"SELECT Name as Name FROM {ServerName}..{Schema}.Application WHERE ID = ?";

Выдает ошибку в этой строке кода:

DataApplicationBlockHelper<string>.Get(db, dbCommand, Obj);

UPDATE

Я нашел виновника. Он не заменяет заполнитель {Schema}. Когда я фактически удалил это из запроса и поместил имя схемы, это работало как шарм. Это вещь .net, в которую я верю? Может кто-нибудь помочь, пожалуйста, как заменить {Schema} значением, извлеченным из web.config?

1 Ответ

0 голосов
/ 14 января 2019

Хотя я не могу говорить о синтаксисе самих запросов 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 #.

...