ADO Updateable Queries - ошибка, когда в одной из соединенных таблиц нет записей - PullRequest
2 голосов
/ 18 мая 2011

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

Однакои я удивлен, что до сих пор не сталкивался с этой проблемой, когда в одной из соединенных таблиц нет записи для (главного) ключа, и пользователь пытается изменить поле в этой таблице, ADO даетзнаменитая ошибка «Строка не может быть найдена ...» в сообщении.

Насколько я понимаю, эта ошибка, драйвер ADO пытается найти запись, чтобы обновить ее поля - и, конечно, в этомНапример, нет записей для поиска.В этих условиях я ожидал, что драйвер ADO выдаст эквивалент запроса UPDATE для основной таблицы, но запрос INSERT для вспомогательной таблицы.

Кто-нибудь еще сталкивался с этой проблемой и нашел решение?

Используемый драйвер ADO - поставщик OLE DB Jet 4.0, подключающийся к базе данных Access (mdb).

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

Вот базовая версия SQL, которую я использую:

SELECT 
    Table1.CustomerNo, Table1.Field1, Table1.Fieldn,  
    Table2.CustomerNo, Table2.Field1, Table2.Fieldn  
FROM 
    Table1 
LEFT JOIN Table2 
    ON Table1.CustomerNo = Table2.CustomerNo  
WHERE 
    Table1.CustomerNo = Newcode;

В качестве эксперимента я попробовал то же самое в MS Access 2007, и это сработало, поэтому, возможно, решение в ADO (но тогда Access, вероятно, использует другой драйвер).

Ответы [ 2 ]

0 голосов
/ 25 октября 2012

Сначала попробуйте функцию locate, чтобы убедиться, что оба поля есть. Сделайте параметр равным полю, если он найден, и логическое значение true, иначе обновите или вставьте новое поле со значением другого. После этого вы знаете, что запись существует, и вы можете присоединиться к полям ... или вы можете использовать try, кроме finally, чтобы сначала попытаться выполнить инструкцию, кроме случаев, когда поле не найдено, а затем, наконец, создать новую запись. Поместите все это в повторение до и убедитесь, что в предложении до используется locate в обеих таблицах, чтобы увидеть, найдено ли оно.

0 голосов
/ 21 сентября 2011

В конце концов, я выбрал решение «взломать». Обновляемый запрос ADO для 2 таблиц будет работать только в том случае, если отзывы клиентов были указаны в обеих таблицах. Итак, я должен был проверить это, и если соответствующая запись отсутствовала в таблице 2, пришлось сначала вставить ее, прежде чем вызывать основной запрос. Вот код:

   //Query customer account - open query from Table1 and Table2 tables                     
   TwoTableQuery.Close;
   //
   //SELECT Table2.CustomerNo
   // FROM Table2
   //WHERE (Table2.CustomerNo = CustomerCode);
   Table2Query.Close;
   Table2Query.Parameters[0].Value := CustomerCode;
   Table2Query.Open;                                /
   //does the Table2 record exist for this customer?
   if Table2Query.RecordCount = 0 then
   begin   //no, so create a new record
      Table2Query.Insert;
      Table2Query.FieldByName('CustomerNo').AsString := CustomerCode;
      Table2Query.Post;
      Table2Query.Close;
   end;
   //okay, now okay to open main query
   TwoTableQuery.Parameters[0].Value := CustomerCode;
   TwoTableQuery.Open;                                 

Это не эффективно, а также создает записи (в таблице 2), которые могут не понадобиться. Но, похоже, единственное решение.

...