2014-09-13 3 views
0

Я работаю над большим проектом с большим количеством форм, используя BDE и ODBC для подключения к базе данных MySQL.Delphi 2010, проблема с параметром BDE, AsString, AsAnsiString

Я могу скомпилировать его в Delphi 2009, и он отлично работает. Когда я компилирую его в Delphi 2010, ничего не работает, потому что TQuery не может правильно передать значения параметров.

Вот пример:

txtUsername.Text = 'Admin'; 
Query1.Close; 
Query1.SQL.Text = 'Select Count(*) From Tbl_User where Username = :username'; 
Query1.ParamByName('username').AsString = txtUsername.Text; 
Query.Open(); 

SQL, будет отправлен в MySQL, выглядит следующим образом:

Select Count(*) From Tbl_User where Username = 'A' 

только первый символ параметра будет отправлено на сервер: 'A' вместо 'Admin'

Но если я использую

Query1.ParamByName('username').AsAnsiString , then 

он будет отлично работает и параметр будет отправлен полностью:

Select Count(*) From Tbl_User where Username = 'Admin' 

Есть огромное количество TQuery и TTable в проекте и его невозможно изменить все вызовы AsString к AsAnsiString.

Есть ли решение для этого? любые настройки, чтобы заставить его работать нормально? возможно, заставив его использовать Ansi по умолчанию вместо Unicode?

Я попытался найти некоторую настройку в опции компиляции и изменить параметры ODBC, но ни один из них не работал.

Любая помощь будет оценена по достоинству.

+0

«его невозможно изменить все вызовы AsString на AsAnsiString». Конечно, если у вас есть источник вашего проекта. – MartynA

+1

Извините за OT, но, возможно, это момент, чтобы избавиться от устаревшего BDE. Я знаю, что это большая работа. – bummi

+0

У меня есть источник, но он не является доступным, его трудоемким и дорогостоящим, и мой клиент не пойдет на это. Есть более 200 форм и тысячи строк кода. С другой стороны, отправка параметров строки не является единственной проблемой. Есть много подобных проблем со строкой. – QProgrammer

ответ

0

Я понимаю давление на быстрые и дешевые решения, но иногда они будут быстрыми и дешевыми только в первый момент, а затем превратятся (в ближайшем будущем) в проблему монстров без какого-либо решения.

Итак, для первого хода, я рекомендую вам прочитать сообщение на Regex Replace. Используйте это, чтобы заменить все свои .AsString на .AsAnsiString и быстро запустить приложение, как и ожидалось.

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

  1. Снимайте наборы данных из ваших форм и поместить их в DataModule, так что вы не будете смешивать настойчивость и бизнес-кода с кодом представления;
  2. Прекратите работать с конкретным набором данных в своем бизнес-коде, перейдите на TClientDataset, который лучше, чем любой другой набор данных, и даст вам лучший дизайн приложения и полную независимость базы данных и промежуточного ПО;
  3. Создайте новый уровень базы данных, поместив всю базу данных и спецификацию промежуточного программного обеспечения за interface, что даст вам невероятный уровень абстракции базы данных.

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