Почему DBX пытается указать имя моей таблицы? - PullRequest
1 голос
/ 23 марта 2011

У меня TSimpleDataSet подключен к базе данных Firebird. Внутренний набор данных CommandType для набора данных имеет значение ctTable, а для CommandText установлено имя таблицы. Поэтому я ожидаю, что когда я установлю его в Active, он сгенерирует запрос, который выглядит как select * from TableName.

Вместо этого, по какой-то странной причине, где-то во внутреннем коде DB Express он пытается поместить кавычки вокруг имени таблицы, поэтому я получаю select * from "TableName", что, конечно, вызывает синтаксические ошибки. Очевидно, кавычки происходят из свойства Metadata TSqlConnection, которое доступно только для чтения, поэтому я не могу исправить это в коде. (Думаю, в этом было бы слишком много смысла.)

Кто-нибудь знает, как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

Добавление этого решения по запросу.Однако не буду отмечать его как принятый, потому что это похоже на уродливый хак, и, если возможно, я бы хотел более элегантный способ предотвратить проблему:

procedure RTTISurgery(connection: TSqlConnection);
var
  cls: TRttiType;
begin
  cls := TRttiContext.Create.GetType(connection.Metadata.ClassType);
  cls.GetField('FQuotePrefix').SetValue(connection.Metadata, '');
  cls.GetField('FQuoteSuffix').SetValue(connection.Metadata, '');
end;

ПРИМЕЧАНИЕ: я не рекомендую использоватьметодов хирургии RTTI как решение общего назначения задач программирования.Его следует использовать только тогда, когда нет лучшего решения, поскольку оно почти всегда включает нарушение инкапсуляции.(Какой смысл его использовать: последнее решение для исправления слишком инкапсулированных ошибок.)

0 голосов
/ 23 марта 2011

Кавычки могут обеспечить возможность использования таблиц с именами, которые могут конфликтовать с другими идентификаторами.Большинство баз данных - не знаю FB - позволяют использовать зарезервированные идентификаторы в качестве имен объектов, если они заключены в кавычки, т.е. SELECT TIMESTAMP FROM X может не работать, в то время как SELECT "TIMESTAMP" FROM X может.IIRC - это правило SQL-92, обеспечивающее полную совместимость, если вводятся новые ключевые слова.Имейте в виду, что при использовании кавычек идентификаторы объектов могут (или должны, я не помню) становиться чувствительными к регистру, поэтому если у вас есть таблица INVOICE, выбрать * из "invoice" не будет работать, а выбрать * из "INVOICE""Будет.

...