Почему DBX пытается указать имя моей таблицы в кавычках?

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

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

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


person Mason Wheeler    schedule 22.03.2011    source источник
comment
Мейсон, попробуй установить свойство commandtext DataSet, связанное с TSimpleDataSet, в верхний регистр. пример изменения SimpleDataSet1.DataSet.CommandText:='TableName'; на SimpleDataSet1.DataSet.CommandText:='TABLENAME';   -  person RRUZ    schedule 23.03.2011
comment
@RRUZ: Хорошо, это сработало, но мне это не нравится. База данных не чувствительна к регистру, и это хорошо, и я не хочу, чтобы какая-то ошибка включала чувствительность к регистру, когда я никогда не просил об этом. Я ищу способ отключить это, если он есть.   -  person Mason Wheeler    schedule 23.03.2011
comment
@Mason, лично я стараюсь не использовать ctTable в commnadType, вместо этого попробуйте установить commnadType на ctQuery и CommandText на select * from TableName   -  person RRUZ    schedule 23.03.2011
comment
@RRUZ: Из-за таких проблем? :P Я нашел способ изменить метаданные с небольшой операцией RTTI, но это уродливый хак, и я бы предпочел не делать этого таким образом.   -  person Mason Wheeler    schedule 23.03.2011
comment
@RRUZ, какая версия оракула чувствительна к регистру в этом отношении?   -  person jachguate    schedule 23.03.2011
comment
+1 за небольшую операцию RTTI :)   -  person jachguate    schedule 23.03.2011
comment
@jachguate: Oracle становится чувствительной к регистру, когда вы используете кавычки, см. мой ответ ниже.   -  person    schedule 23.03.2011
comment
@lsandon оригинальный комментарий RRUZ теперь кажется удаленным, IMHO любая база данных, совместимая с sql-92, будет поддерживать двойные кавычки, чтобы сделать любой идентификатор чувствительным к регистру, но IIRC RRUZ говорил о чувствительности к регистру без двойных кавычек.   -  person jachguate    schedule 23.03.2011
comment
AFAIK Oracle не чувствителен к регистру, если вы не создаете идентификаторы с использованием синтаксиса в кавычках. IIRC вы можете создавать таблицы INVOICE, Invoice и Invoice в одной и той же схеме, но тогда вы должны получить к ним доступ, используя синтаксис в кавычках.   -  person    schedule 23.03.2011
comment
@ Мейсон, ты не мог бы показать нам, что это была за операция?   -  person jachguate    schedule 23.03.2011
comment
@jachguate: Опубликовано как ответ.   -  person Mason Wheeler    schedule 23.03.2011


Ответы (2)


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

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 в качестве универсального решения проблем программирования. Его следует использовать только тогда, когда нет лучшего решения, поскольку оно почти всегда связано с нарушением инкапсуляции. (В чем смысл его использования: последнее решение для исправления чрезмерно инкапсулированных ошибок.)

person Mason Wheeler    schedule 23.03.2011
comment
+1 Уродливый хак, как сказано, но приятно иметь его в наборе инструментов, пока эта ошибка не будет исправлена. Кстати, вы проверили QC об этом? Я буду голосовать за него, я пользователь Firebird, но не пользователь SimpleDataSet и не фанат командного типа ctTable, но я думаю, что это заслуживает исправления. - person jachguate; 23.03.2011

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

person Community    schedule 23.03.2011
comment
@lsandon, обратите внимание, что вопрос не в том, как работают двойные кавычки, а в идентификаторах двойных кавычек DBX по умолчанию и в том, как отключить это поведение. - person jachguate; 23.03.2011
comment
Или метаданные возвращаются таким образом (похоже, что многие инструменты цитируют идентификаторы при запросе определения объекта), или DBX цитирует их, чтобы убедиться, что идентификаторы действительны. - person ; 23.03.2011