Изменение базы данных приложения VC ++ 6 с Access на SQL Server - могу ли я использовать связанные таблицы? - PullRequest
0 голосов
/ 15 июля 2009

У нас есть приложение Visual C ++ 6, которое сохраняет данные в базе данных Access с использованием DAO. Классы базы данных были созданы с использованием ClassWizard, основываясь на CDaoRecordset.

Нам нужно перейти с Access на SQL Server, потому что некоторые клиенты имеют огромные базы данных (1,5 ГБ +), на которых очень медленно запускаются отчеты (с использованием Crystal Reports и другого приложения).

Мы не слишком беспокоимся о производительности этого приложения VC ++ - оно загружает данные из регистраторов данных и помещает их в базу данных.

Я использовал «Microsoft SQL Server Migration Assistant 2008 for Access» для переноса моей базы данных из Access в SQL Server - затем он связал таблицы в исходной базе данных Access. Если я открою базу данных Access, то смогу просматривать данные в базе данных SQL Server.

Затем я попытался использовать эту базу данных с моим приложением и продолжаю сталкиваться с проблемами.

Я изменил все мои наборы записей на dbOpenDynaset вместо dbOpenTable. Я также изменил myrecordsetptr->open() вызовы на myrecordsetptr->open(dbOpenDynaset, NULL, dbSeeChanges), чтобы не получать исключения.

Но ... Я застрял, получая исключение 3251 - «Операция не поддерживается для этого типа объекта» для одной из моих таблиц, когда я пытаюсь установить текущий индекс, используя myrecordsetptr->->SetCurrentIndex(_T("PrimaryKey"));

Есть ли какие-нибудь хитрости, чтобы заставить связанные таблицы работать без переписывания всего кода доступа к базе данных?

[ОБНОВЛЕНИЕ 17/7/09 - спасибо за советы - я изменю все ссылки Seek() на FindFirst() / FindNext() и обновлю их в зависимости от того, как я работаю]

Ответы [ 3 ]

0 голосов
/ 15 июля 2009

Почему вы используете SetCurrentIndex, когда вы переместили свою таблицу из Access в SQL Server?
Я имею в виду - вы используете Access только для связанной таблицы.

Кроме того, согласно этой странице - там говорится, что SetCurrentIndex может использоваться для набора записей табличного типа.

0 голосов
/ 16 июля 2009

В каком контексте вы используете команду SetCurrentIndex? Если это подпрограмма, использующая SEEK, вы не можете использовать ее со связанными таблицами.

Кроме того, это только Jet и не будет иметь никакого значения с другим бэкэндом.

Я не советую использовать SEEK (даже в Access с таблицами Jet), за исключением самых необычных ситуаций, когда вам нужно прыгать вокруг одной таблицы тысячи раз в цикле. Во всех других обстоятельствах DAO вы должны либо получать ограниченное количество записей, используя ограничительное предложение WHERE (если вы используете SEEK для доступа к одной записи), либо вы должны использовать .FindFirst / FindNext. Да, последние два пропорционально намного медленнее, чем SEEK, но они гораздо более переносимы, а также абсолютная разница в производительности будет существенной, только если вы делаете тысячи из них.

Кроме того, если ваш SEEK находится в упорядоченном поле, вы можете оптимизировать навигацию, проверив, является ли искомое значение большим или меньшим, чем значение текущей записи, и выбрав .FindPrevious или .FindNext, соответственно (поскольку DAO набор записей Поиск операций работает последовательно через индекс).

0 голосов
/ 15 июля 2009

Да, но я не думаю, что вы можете установить / изменить индекс связанной таблицы в наборе записей, поэтому вам придется соответствующим образом изменить код.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...