Форум сайта python.su
Здравствуйте.
Зашла в тупик моя попытка пробиться к данным 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 FTESTODBC-соединение одно и то же
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)')
Отредактировано (Окт. 27, 2010 13:16:22)
Офлайн
так не надо
cursor.execute("exec ('"+sqlstmt+"') at FTEST")
cursor.execute(sqlstmt)
Офлайн
2villager: AT относится к linkedserver и является расширением Transact-SQL для SQL2005
По сабжу - интуитивно нашел объяснение :
when you run it in a tool like WinSql/isql a simple transaction is used.Вот теперь думаю, как обойти “Distributed Transaction”
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
Отредактировано (Окт. 30, 2010 08:53:16)
Офлайн
В общем, к Python вопросов нет - он ни причем : модель ADO так устроена.
subj решается на уровне модели транзакции и обходится двумя способами :
1. либо тупой вызов из питона 'isql < script_с_апдейтом
2. либо настройкой linkedserver option
Тема закрыта.
Офлайн