Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 5, 2013 14:50:22

agaspher
Зарегистрирован: 2013-03-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

mssql server compact 3.5+adodbapi, ошибка при чтении nvarchar(300)

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:
[]
если поле уменьшить до nvarchar(50) то работает без проблем,
в чем тут подвох, я что-то делаю не так?
на stackoverflow подобный вопрос висит без ответа 3 месяца, может тут знатоки подскажут?
и есть ли что-то кроме adodbapi для работы с mssql compact для питона?

Офлайн

#2 Авг. 5, 2013 20:21:40

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

mssql server compact 3.5+adodbapi, ошибка при чтении nvarchar(300)

я работаю с mssql через pyodbc, работает норм, настройка и примеры под linux.
вот для винды, раньше работало, сейчас - нужно проверять.

ЗЫ: спутал с mssql

Отредактировано o7412369815963 (Авг. 5, 2013 20:23:27)

Офлайн

#3 Авг. 13, 2013 17:50:46

agaspher
Зарегистрирован: 2013-03-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

mssql server compact 3.5+adodbapi, ошибка при чтении nvarchar(300)

попробовал по-другому:

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()

работает, но внятной документации не нашел, на pywin32 раздел win32com идет на 404,
поэтому не смог выяснить почему метод GetRows() возвращает кортеж, в котором все строки column_1 запиханы в первый элемент и как их разделить

Офлайн

#4 Авг. 14, 2013 08:30:31

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

mssql server compact 3.5+adodbapi, ошибка при чтении nvarchar(300)

Вы на самом деле здесь используете ActiveX объекты из ADO DB и в данном случае win32com.client.Dispatch просто инициализирует эти объекты через IDispatch интерфейс.

Соответственно, pywin32 здесь не при чем и документацию нужно читать у майкрософт: Recordset Object (ADO).



Отредактировано ziro (Авг. 14, 2013 08:45:24)

Офлайн

#5 Авг. 14, 2013 16:05:31

agaspher
Зарегистрирован: 2013-03-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

mssql server compact 3.5+adodbapi, ошибка при чтении nvarchar(300)

спасибо за ссылку, пригодилась… понял, что оба раза делал по сути одно и то же
в 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)
проблемы начинаются с nvarchar(128), с nvarchar(127) все ровно
видимо превышение размера какого-то типа, что делать дальше, ума не приложу, надо работать с базой сторонней проги с compact'ом

Офлайн

#6 Авг. 15, 2013 05:28:41

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

mssql server compact 3.5+adodbapi, ошибка при чтении nvarchar(300)

agaspher
проблемы начинаются с nvarchar(128), с nvarchar(127) все ровно
А это косяк в OLE DB провайдере. Вот тут тоже человек на него наткнулся. В ответах ему пишут, что одному помогла смена типа курсора. Может вам попробовать версию Microsoft SQL Server Compact до четвертой поднять?

update: тут коллега с mssql плотно работал, пообщался с ним, он говорит, что это известное ограничении для CE 3.5, варианты решения: сменить курсор на серверный, поднять версию, в 4 вроде нет ограничения, или ходить к этой базе через другого провайдера.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Авг. 15, 2013 07:05:24)

Офлайн

#7 Авг. 15, 2013 10:10:32

agaspher
Зарегистрирован: 2013-03-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

mssql server compact 3.5+adodbapi, ошибка при чтении nvarchar(300)

попробовал поднять версию, не изменилось вообще ничего, ошибка слово в слово та же.
со сменой типа курсора, мне кажется, должно сработать, но знаний не хватает как это сделать, это что-то связанное с win32com.server.register?

А это косяк в OLE DB провайдере
насколько я понимаю, данный OLE DB единственный способ работать с CE, то есть софт на любом языке должен его использовать или я заблуждаюсь?

Офлайн

#8 Авг. 15, 2013 10:44:24

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

mssql server compact 3.5+adodbapi, ошибка при чтении nvarchar(300)

agaspher
со сменой типа курсора, мне кажется, должно сработать, но знаний не хватает как это сделать, это что-то связанное с win32com.server.register?
CursorLocation, есть такое свойство у Recordset и есть у Connection, тогда Recordset из него берет по умолчанию.
agaspher
насколько я понимаю, данный OLE DB единственный способ работать с CE, то есть софт на любом языке должен его использовать или я заблуждаюсь?
Да черт его знает, я давно уже далек от виндоус, помню вот для dbf куча разных провайдеров была, может и компкту можно через какой-нибудь SQLOLEDB ходить.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#9 Авг. 15, 2013 13:33:33

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

mssql server compact 3.5+adodbapi, ошибка при чтении nvarchar(300)

В старых версиях SQL SERVER CE максимальная длина nvarchar 510 байт.
Официальная документация рекомендует использовать ntext, если данные превышают этот размер.
В 4 версии - 8000 байт.

Точно не помню, может в CE 3.5 SP2 расширили nvarchar.
Там были какие-то изменения по поддержке типов данных.
Если не стоит SP2 и важна работа именно CE 3.5, установите.



Офлайн

#10 Окт. 28, 2014 17:41:41

agaspher
Зарегистрирован: 2013-03-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

mssql server compact 3.5+adodbapi, ошибка при чтении nvarchar(300)

пожалуй апну темку, возникла необходимость поправить то, что было написано тогда (проблему обошел отказавшись от использования длинных полей, благо ключевой информации в них не было)

попробовал подключиться и пообщаться с базой через этот же провайдер, но из c#, никаких проблем, при обращении к длинным полям не возникло, данная проблема скрыта именно в adodbapi, и как я понял, разработчики признают этот баг, правда в ответ предлагают только обновиться, что естественно результата не дает, на данный момент версия v2.6.0.7 и ошибка в ней та же… все это очень печально, неужели в python нет возможности полноценно работать с CE

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version