Не удалось вставить запись с текстовыми полями длиной более 257 символов через pyodbc

У меня есть сервер SQL, версия которого 10.50.4000. Я подключаюсь к нему из Linux через pyodbc с драйвером Native Client 11.0 сервера SQL. Вот определение таблицы.

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [ctm].[services](
    [id] [char](36) NOT NULL,
    [Name] [varchar](45) NOT NULL,
    [ServiceDescription] [varchar](256) NULL,
    [Version] [varchar](45) NULL,
    [Status] [varchar](45) NOT NULL,
    [StatusDescription] [varchar](256) NULL,
    [WSDL] [text] NULL,
    [WADL] [text] NULL,
    [XSD] [text] NULL,
    [CreatedBy] [varchar](100) NULL,
    [CreatedOn] [datetime] NOT NULL,
    [CreatedAt] [varchar](45) NULL,
    [UpdatedBy] [varchar](100) NULL,
    [UpdatedOn] [datetime] NULL,
    [UpdatedAt] [varchar](45) NULL,
    [deleted] [bit] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

Поле 'WSDL' используется для хранения схемы веб-сервиса. Я прочитал файл схемы и сохранил его в строку. Но когда я попытался вставить запись в сервер базы данных, я получил следующее сообщение об ошибке:

Traceback (последний вызов был последним): файл "", строка 1, в pyodbc.DataError: ('22001', '[22001] [Microsoft][собственный клиент SQL Server 11.0] Строковые данные, усечение справа (0) (SQLExecDirectW) ")

Вот команда, которую я выполнил:

cursor.execute ("" "вставить в ctm.services (id, Имя, ServiceDescription, Версия, Состояние,StatusDescription, WSDL, WADL, XSD, CreatedBy, CreatedOn, CreatedAt, updatedBy, UpdatedOn,UpdatedAt, удалено) значения (?,?,?,?,?,?,?,?,?,?,current_timestamp,?, null, null, null,?) """, 'abcdefghijklmn', 'whatservice', 'testing', '1.0.0', 'active', '', 'NOTES!!! Это должен быть контекст файла схемы. Но он не может быть показан по какой-то причине. Поэтому я ввожу здесь мусорное сообщение', 'null', 'null', getpass.getuser(), socket.gethostname(), '0')

Когда размер строки WSDL меньше 257 символов, я могу вставить запись в сервер базы данных. Если оно больше 257, это не удалось. Но, как мы видим, тип поля WSDL - текстовый. Это позволяет 2147483647 символов. Пожалуйста, проверьте ниже отладочный вывод:

>>> for row in cursor.columns(table='services'):
...       print row.column_name + " : " + str(row.data_type) + " size:" + str(row.column_size)
... 
id : 1 size:36
Name : 12 size:45
ServiceDescription : 12 size:256
Version : 12 size:45
Status : 12 size:45
StatusDescription : 12 size:256
WSDL : -1 size:2147483647
WADL : -1 size:2147483647
XSD : -1 size:2147483647
CreatedBy : 12 size:100
CreatedOn : 93 size:23
CreatedAt : 12 size:45
UpdatedBy : 12 size:100
UpdatedOn : 93 size:23
UpdatedAt : 12 size:45
deleted : -7 size:1
name : -9 size:128
service_id : 4 size:10
principal_id : 4 size:10
service_queue_id : 4 size:10

Я использовал wireshark для отладки и обнаружил, что команда sql не была отправлена ​​на сервер sql. Поэтому сообщение об ошибке должно исходить от драйвера собственного клиента SQL-сервера.

Я пытался найти решение для Google, но ничего не смог найти. Кто-нибудь сталкивался с такими же проблемами раньше?

PS Я пробовал ту же команду под Microsoft SQL Server Management Studio. Работает без проблем. Таким образом, проблема может быть связана с драйвером ODBC или несоответствием между драйвером ODBC и pyodbc.

0 ответов

Другие вопросы по тегам