Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 27, 2010 13:14:37

warpson
От:
Зарегистрирован: 2010-10-27
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

pyodbc и MSSQL

Здравствуйте.

Зашла в тупик моя попытка пробиться к данным VFP из питона (с linux платформы ):

1. вариант просто из isql прекрасно отрабатывает чтение
exec ('select * from pdoc where numdoc_p=51490') at FTEST
и даже UPDATE

2. то же самое в питоне

import pyodbc


cnxn=pyodbc.connect(DSN='mssql-office',UID='sa',pwd='…')
cnxn.autocommit=True

cursor=cnxn.cursor()

sqlstmt='select * from pdoc where numdoc_p=51490'

print “exec ('”+sqlstmt+“') at FTEST”
cursor.execute(“exec ('”+sqlstmt+“') at FTEST”)
падает с ошибкой
exec ('select * from pdoc where numdoc_p=51490') at FTEST
Traceback (most recent call last):
File “Draft3b.py”, line 15, in <module>
cursor.execute(“exec ('”+sqlstmt+“') at FTEST”)
pyodbc.ProgrammingError: ('42000', ' The requested operation could not be performed because OLE DB provider “VFPOLEDB” for linked server “FTEST” does not support the required transaction interface. (7390) (SQLExecDirectW)')
ODBC-соединение одно и то же
Цель - делать update на MSSQL linkedserver

Может быть можно изменить свойства cnxn ?



Отредактировано (Окт. 27, 2010 13:16:22)

Офлайн

#2 Окт. 28, 2010 22:19:24

villager
От:
Зарегистрирован: 2008-11-04
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

pyodbc и MSSQL

так не надо

cursor.execute("exec ('"+sqlstmt+"') at FTEST")
так надо
cursor.execute(sqlstmt)



Офлайн

#3 Окт. 30, 2010 08:50:20

warpson
От:
Зарегистрирован: 2010-10-27
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

pyodbc и MSSQL

2villager: AT относится к linkedserver и является расширением Transact-SQL для SQL2005

По сабжу - интуитивно нашел объяснение :

when you run it in a tool like WinSql/isql a simple transaction is used.

When you run a dml statement (insert, update, delete) against a linked server, a distributed transaction is started;

It's controlled by the MSDTC = Distributed Transaction Coordinator; MSDTC has to run on both server, see: http://msdn.microsoft.com/en-us/library/ms190799.aspx
Вот теперь думаю, как обойти “Distributed Transaction”
То ли отменить как-то в pyodbc начало транзакции (не Autocommit=False, а вообще) ?



Отредактировано (Окт. 30, 2010 08:53:16)

Офлайн

#4 Окт. 31, 2010 20:14:03

warpson
От:
Зарегистрирован: 2010-10-27
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

pyodbc и MSSQL

В общем, к Python вопросов нет - он ни причем : модель ADO так устроена.

subj решается на уровне модели транзакции и обходится двумя способами :

1. либо тупой вызов из питона 'isql < script_с_апдейтом
2. либо настройкой linkedserver option

Тема закрыта.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version