TSQLConnection.GetFieldNames не работает на 64-разрядной машине

У меня есть код Delphi 2005, который я использую для получения имен полей таблицы базы данных.
Он без проблем работает на 32-битных машинах (Windows XP, Windows Vista, Windows 7).

Однако он не возвращает имена полей при запуске на 64-битной машине (Windows Vista или Windows 7).

Код выглядит так:

uses  Db, SQLExpr;  

procedure TForm1.ShowFieldNames(SQLConnection: TSQLConnection;  
                                FieldNames: TStringList);  
  var FieldIndex: Integer;  
begin  
  SQLConnection.GetFieldNames('TABLENAME', FieldNames);  
  ListBox.Items.Add('Field Count = ' + IntToStr(FieldNames.Count));  
  for FieldIndex:=0 to FieldNames.Count - 1 do  
    ListBox.Items.Add('FieldName = ' + FieldNames[FieldIndex]);  
  end;  

На 32-битных машинах это показывает ненулевой счетчик и перечисляет имена полей, на 64-битных машинах это отображает «Счетчик полей = 0»

Когда я перекомпилирую с Delphi 2006 или Delphi 2007, проблема исчезает.

(Я использую Firebird 2.5)

Я хочу исправить это, не обновляя программу до более поздней версии Delphi.

Я также хотел бы понять, почему возникает проблема - почему программа по-другому ведет себя в 64-битной Windows.

Не могли бы вы дать мне какой-нибудь совет?


person urtlet    schedule 31.08.2011    source источник
comment
Звучит как ошибка конкретно в D2005. (Что меня не удивит; в D2005 было много ошибок.) Я должен спросить, если у вас есть D2006 и D2007, почему вы не хотите обновляться? Мне известно о каких-либо серьезных проблемах с совместимостью с 2005 по ›2007 годы ...   -  person Mason Wheeler    schedule 31.08.2011
comment
Это может быть ошибка в D2005, но я озадачен, почему это происходит только на 64-битных машинах. Основная причина не обновляться заключается в том, что у моего клиента нет лицензий на D2006 и D2007, и они хотят иметь возможность поддерживать код. Думаю, есть проблемы и со сторонними библиотеками. Я попытаюсь вытащить имена полей из RDB $ RELATION_FIELDS.   -  person urtlet    schedule 31.08.2011
comment
Вы всегда подключаетесь к одному и тому же серверу FireBird, т.е. единственное, что меняется, - это скомпилированный exe (с использованием Delphi 2005 против Delphi 2006) и клиентская ОС (32-битная Win против 64bitWin)?   -  person ain    schedule 31.08.2011
comment
Я установил ту же версию Firebird (32-разрядный клиент и 32-разрядный сервер) на новый 64-разрядный компьютер и на 32-разрядную виртуальную машину Windows-7. Код работал на многих 32-битных машинах (в основном под управлением Windows XP и Vista) и терпел неудачу как минимум на 4 64-битных машинах (под управлением Vista и Windows 7).   -  person urtlet    schedule 31.08.2011


Ответы (1)


Используя запрос:

SELECT RDB$FIELD_NAME FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME='TABLENAME';  

затем обрезка возвращаемых результатов дает мне имена полей, и это действительно работает на 64-битной машине.

Это не объясняет, почему программа работает по-другому при запуске на 64-битной машине, но дает мне работоспособное решение.

person urtlet    schedule 31.08.2011