Форум сайта python.su
python 2.7+adodbapi v2.5.0.f+mssql server compact 3.5
при простом селекте поля nvarchar(300) получаю ошибку
cursor.execute(query) File "build\bdist.win32\egg\adodbapi\adodbapi.py", line 815, in execute File "build\bdist.win32\egg\adodbapi\adodbapi.py", line 668, in _execute_command File "build\bdist.win32\egg\adodbapi\adodbapi.py", line 551, in _raiseCursorError File "build\bdist.win32\egg\adodbapi\apibase.py", line 53, in standardErrorHandler adodbapi.apibase.DatabaseError: (-2147352567, (0, u'Microsoft Cursor Engine', None, 0, -2147217887), None) Command: select name from table Parameters: []
Офлайн
я работаю с mssql через pyodbc, работает норм, настройка и примеры под linux.
вот для винды, раньше работало, сейчас - нужно проверять.
ЗЫ: спутал с mssql
Отредактировано o7412369815963 (Авг. 5, 2013 20:23:27)
Офлайн
попробовал по-другому:
import win32com conn = win32com.client.Dispatch(r'ADODB.Connection') DSN = (r"PROVIDER = Microsoft.SQLSERVER.CE.OLEDB.3.5;DATA SOURCE = c:\base.sdf;SSCE:Database Password='pass';") conn.Open(DSN) rs = win32com.client.Dispatch(r'ADODB.Recordset') strsql = "select column_1, column_2 from table" rs.Open(strsql, conn) for tup in rs.GetRows(): print u''.join(tup) conn.Close()
Офлайн
Вы на самом деле здесь используете ActiveX объекты из ADO DB и в данном случае win32com.client.Dispatch просто инициализирует эти объекты через IDispatch интерфейс.
Соответственно, pywin32 здесь не при чем и документацию нужно читать у майкрософт: Recordset Object (ADO).
Отредактировано ziro (Авг. 14, 2013 08:45:24)
Офлайн
спасибо за ссылку, пригодилась… понял, что оба раза делал по сути одно и то же
в adodbapi отключил exception, разобрался с функцией GetRows() и пришел к общему знаменателю
в обоих случаях дело в следующей строке:
файл \win32com\client\dynamic.py
result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args) pywintypes.com_error: (-2147352567, '\xce\xf8\xe8\xe1\xea\xe0.', (0, u'Microsoft SQL Server Compact OLE DB Provider', 'Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена.', 1240649, -2146825023), None)
Офлайн
agaspherА это косяк в OLE DB провайдере. Вот тут тоже человек на него наткнулся. В ответах ему пишут, что одному помогла смена типа курсора. Может вам попробовать версию Microsoft SQL Server Compact до четвертой поднять?
проблемы начинаются с nvarchar(128), с nvarchar(127) все ровно
Отредактировано PooH (Авг. 15, 2013 07:05:24)
Офлайн
попробовал поднять версию, не изменилось вообще ничего, ошибка слово в слово та же.
со сменой типа курсора, мне кажется, должно сработать, но знаний не хватает как это сделать, это что-то связанное с win32com.server.register?
А это косяк в OLE DB провайдеренасколько я понимаю, данный OLE DB единственный способ работать с CE, то есть софт на любом языке должен его использовать или я заблуждаюсь?
Офлайн
agaspherCursorLocation, есть такое свойство у Recordset и есть у Connection, тогда Recordset из него берет по умолчанию.
со сменой типа курсора, мне кажется, должно сработать, но знаний не хватает как это сделать, это что-то связанное с win32com.server.register?
agaspherДа черт его знает, я давно уже далек от виндоус, помню вот для dbf куча разных провайдеров была, может и компкту можно через какой-нибудь SQLOLEDB ходить.
насколько я понимаю, данный OLE DB единственный способ работать с CE, то есть софт на любом языке должен его использовать или я заблуждаюсь?
Офлайн
В старых версиях SQL SERVER CE максимальная длина nvarchar 510 байт.
Официальная документация рекомендует использовать ntext, если данные превышают этот размер.
В 4 версии - 8000 байт.
Точно не помню, может в CE 3.5 SP2 расширили nvarchar.
Там были какие-то изменения по поддержке типов данных.
Если не стоит SP2 и важна работа именно CE 3.5, установите.
Офлайн
пожалуй апну темку, возникла необходимость поправить то, что было написано тогда (проблему обошел отказавшись от использования длинных полей, благо ключевой информации в них не было)
попробовал подключиться и пообщаться с базой через этот же провайдер, но из c#, никаких проблем, при обращении к длинным полям не возникло, данная проблема скрыта именно в adodbapi, и как я понял, разработчики признают этот баг, правда в ответ предлагают только обновиться, что естественно результата не дает, на данный момент версия v2.6.0.7 и ошибка в ней та же… все это очень печально, неужели в python нет возможности полноценно работать с CE
Офлайн