Найти - Пользователи
Полная версия: mssql server compact 3.5+adodbapi, ошибка при чтении nvarchar(300)
Начало » Базы данных » mssql server compact 3.5+adodbapi, ошибка при чтении nvarchar(300)
1
agaspher
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 для питона?
o7412369815963
я работаю с mssql через pyodbc, работает норм, настройка и примеры под linux.
вот для винды, раньше работало, сейчас - нужно проверять.

ЗЫ: спутал с mssql
agaspher
попробовал по-другому:
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 запиханы в первый элемент и как их разделить
ziro
Вы на самом деле здесь используете ActiveX объекты из ADO DB и в данном случае win32com.client.Dispatch просто инициализирует эти объекты через IDispatch интерфейс.

Соответственно, pywin32 здесь не при чем и документацию нужно читать у майкрософт: Recordset Object (ADO).
agaspher
спасибо за ссылку, пригодилась… понял, что оба раза делал по сути одно и то же
в 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'ом
PooH
agaspher
проблемы начинаются с nvarchar(128), с nvarchar(127) все ровно
А это косяк в OLE DB провайдере. Вот тут тоже человек на него наткнулся. В ответах ему пишут, что одному помогла смена типа курсора. Может вам попробовать версию Microsoft SQL Server Compact до четвертой поднять?

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

А это косяк в OLE DB провайдере
насколько я понимаю, данный OLE DB единственный способ работать с CE, то есть софт на любом языке должен его использовать или я заблуждаюсь?
PooH
agaspher
со сменой типа курсора, мне кажется, должно сработать, но знаний не хватает как это сделать, это что-то связанное с win32com.server.register?
CursorLocation, есть такое свойство у Recordset и есть у Connection, тогда Recordset из него берет по умолчанию.
agaspher
насколько я понимаю, данный OLE DB единственный способ работать с CE, то есть софт на любом языке должен его использовать или я заблуждаюсь?
Да черт его знает, я давно уже далек от виндоус, помню вот для dbf куча разных провайдеров была, может и компкту можно через какой-нибудь SQLOLEDB ходить.
Lexander
В старых версиях SQL SERVER CE максимальная длина nvarchar 510 байт.
Официальная документация рекомендует использовать ntext, если данные превышают этот размер.
В 4 версии - 8000 байт.

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

попробовал подключиться и пообщаться с базой через этот же провайдер, но из c#, никаких проблем, при обращении к длинным полям не возникло, данная проблема скрыта именно в adodbapi, и как я понял, разработчики признают этот баг, правда в ответ предлагают только обновиться, что естественно результата не дает, на данный момент версия v2.6.0.7 и ошибка в ней та же… все это очень печально, неужели в python нет возможности полноценно работать с CE
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB