powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вновь обновление данных MSSQL через курсор
12 сообщений из 12, страница 1 из 1
Вновь обновление данных MSSQL через курсор
    #32487159
ArDo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возвращаясь к теме от 23 марта:
Попытался обновить данные MS SQL через курсор

SQLSETPROP(_sqlconn, "Asynchronous", .f. )
SQLSETPROP(_sqlconn, "Transactions", 1 )

_otm_query = " запрос "

SQLEXEC(_sqlconn, _otm_query, "otm_cur")
До этого места все работает изумительно (главное быстро, чего и требовалось).


CURSORSETPROP("SendUpdates", .T.)
CURSORSETPROP("KeyFieldList","DATAAREAID, RECID, VOUCHER")
CURSORSETPROP("Tables", "otm_cur")
CURSORSETPROP("UpdateType",1)
CURSORSETPROP("WhereType",3)
CURSORSETPROP("UpdateNameList","AMOUNTMST Otm_transaction.AMOUNTMST, QTY Otm_transaction.QTY")
CURSORSETPROP("UpdatableFieldList", "AMOUNTMST, QTY")
После изменения данных в курсоре получаем сообщение: No update tables are specifie. Use the Tables property of the cursor.
Подскажите пожалуйста где наврал!
...
Рейтинг: 0 / 0
Вновь обновление данных MSSQL через курсор
    #32487198
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вновь обновление данных MSSQL через курсор
    #32487385
ArDo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вы думаете мне сильно полегчало?

Это то, что я нашел по ссылке

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
   =SQLEXEC(Handle,  "select * from authors" )
     =CURSORSETPROP( "Tables" ,  "authors" )
     ** The next property must include every remote field matched with the
     ** view cursor field.
     =CURSORSETPROP( "UpdateNameList" ,  "au_id authors.au_id, au_lname;
       authors.au_lname, au_fname authors.au_fname, phone;
       authors.phone, address authors.address,;
       city authors.city, state authors.state,;
       zip authors.zip, contract authors.contract" )
     =CURSORSETPROP( "KeyFieldList" ,  "au_id" )
     ** The next property specifies which fields can be updated.
     =CURSORSETPROP( "UpdatableFieldList" ,  "au_lname, au_fname, phone,;
       address, city, state, zip, contract" )
     ** The next property enables you to send updates.
     =CURSORSETPROP( "SendUpdates" , .T.)


Это то, что я наделал по образу и подобию

Код: plaintext
1.
2.
3.
4.
5.
6.
= SQLEXEC(_sqlconn, _otm_query,  "otm_cur" )

= CURSORSETPROP( "Tables" ,  "Otm_transaction" ) 
= CURSORSETPROP( "UpdateNameList" , "AMOUNTMST Otm_transaction.AMOUNTMST, QTY Otm_transaction.QTY" ) 
= CURSORSETPROP( "KeyFieldList" , "DATAAREAID, RECID, VOUCHER" ) 
= CURSORSETPROP( "UpdatableFieldList" ,  "AMOUNTMST, QTY" ) 
= CURSORSETPROP( "SendUpdates" , .T.) 


Это результат:
No key columns are specified for update table "Otm_transaction". Use the KeyFieldList property of the cursor.

И я опять не вижу где наврал.
Случайно это все не может зависеть от структуры запроса или баз данных?
...
Рейтинг: 0 / 0
Вновь обновление данных MSSQL через курсор
    #32487426
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ни фига себе по образу и подобию! А где у тебя в UpdateNameList перечисление ключевых столбцов?
...
Рейтинг: 0 / 0
Вновь обновление данных MSSQL через курсор
    #32487482
ArDo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вот где собака зарыта!

авторА где у тебя в UpdateNameList перечисление ключевых столбцов?
Мне эти столбцы обновлять то не надо было.
Теперь все работает только пришлось установить
Код: plaintext
CURSORSETPROP( "WhereType"  ,4 )

иначе постоянно попадал на Update conflict. Кстати с чем бы сие связано?
...
Рейтинг: 0 / 0
Вновь обновление данных MSSQL через курсор
    #32487590
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> иначе постоянно попадал на Update conflict. Кстати с чем бы сие связано?

An optimistic locking conflict has been detected while trying to update a view.
Make sure your update key is valid.

При добавлении записей при оптимистической блокировке? Возможно, комбиниция ключевых полей не уникальна, поэтому еще нужно ориентироваться и на метку времени.
...
Рейтинг: 0 / 0
Вновь обновление данных MSSQL через курсор
    #32487764
ArDo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оба-на!
А по умолчанию чего?
...
Рейтинг: 0 / 0
Вновь обновление данных MSSQL через курсор
    #32490893
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По умолчанию вообще обновление не поддериживается :) А если про WhereType, то 3
Код: plaintext
3 or DB_KEYANDMODIFIED (from FOXPRO.H) (default). The WHERE clause used to update tables consists of the primary fields specified with the KeyFieldList property and any other fields that are modified.
...
Рейтинг: 0 / 0
Вновь обновление данных MSSQL через курсор
    #32493089
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 ArDo

По-моему, устанавливать CURSORSETPROP("WhereType",4) в Вашем случае достаточно опасно. Хотя, возможно, я ошибаюсь.

Использование CURSORSETPROP("WhereType",4) имеет смысл при наличии поля типа TIMESTAMP в таблице на сервере(в данном случае MS SQL Server-е) и выборке этого поля в VFP cursor.
В Вашем случае, похоже (судя по названиям полей), поля с типом TIMESTAMP в выборке нет.

Опасность, с моей точки зрения, состоит в том, что в Вашем случае, несмотря на то что в VFP CURSORGETPROP("WhereType") возвратит 4, на SQL Server-е выполняется UPDATE-оператор, where clause которого состоит ТОЛЬКО из ключевых полей. Т.е. так, как если бы Вы установили CURSORSETPROP("WhereType",1). В этом можно легко убедиться используя SQL Profiler.
...
Рейтинг: 0 / 0
Вновь обновление данных MSSQL через курсор
    #32493302
ArDo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С точки зрения нормальной логики непонятно откуда конфликт ключа - уже 2 поля дают уникальную комбинацию. CURSORSETPROP("WhereType",4) стоит уже несколько дней и ошибок пока не видно.\r
\r
Уважаемые коллеги я вчера повесил еще один вопрос\r
/topic/88635\r
не погнушайтесь, дайте любые соображения.
...
Рейтинг: 0 / 0
Вновь обновление данных MSSQL через курсор
    #32494946
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 ArDo

Думаю, что может возникнуть ошибка куда более серьёзная чем Update Conflict

Предположим, что Ваша выборка содержит одну запись:
AmountMST = 20, Qty = 10

С ней работают одновременно 2 пользователя. Оба пользователя начинают работу и видят одинаковые данные: AmountMST = 20, Qty = 10

Первый уменьшает Qty на 2, второй на 3.
На стороне VFP у первого выполняется что-то типа
Код: plaintext
replace Qty with Qty -  2 
у второго
Код: plaintext
replace Qty with Qty -  3 


На стороне SQL Server-а будет выполнено

для первого пользователя
Код: plaintext
1.
2.
update otm_transaction
set Qty =  8 
where KEY_ONLY_EXPRESSION

для второго пользователя
Код: plaintext
1.
2.
update otm_transaction
set Qty =  7 
where KEY_ONLY_EXPRESSION

Есть очень хорошие шансы, что по окончании работы на SQL Server-е поле Qty
НЕ БУДЕТ РАВНО 5.
...
Рейтинг: 0 / 0
Вновь обновление данных MSSQL через курсор
    #32496134
ArDo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vklepko
В данном конкретном случае этим можно пренебречь, поскольку такое обновление разрешено только одному пользователю. Остальные работают с неизменяемым курсором.
Все равно спасибо, мысль абсолютно правильная.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вновь обновление данных MSSQL через курсор
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]