Не удалось вставить запись с текстовыми полями длиной более 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.