我有一台SQL服务器版本是10.50.4000。我通过pyodbc使用SQL Server Native Client 11.0驱动程序从linux连接到它。 这是表格定义。
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”用于保留Web服务的架构。我已经阅读了模式文件并将其存储到字符串中。但是当我尝试将记录插入数据库服务器时,我收到了以下错误消息:
追踪(最近一次通话): 文件“”,第1行,in pyodbc.DataError:('22001','[22001] [Microsoft] [SQL Server Native Client 11.0]字符串数据,右截断(0)(SQLExecDirectW)')
这是我执行的命令:
cursor.execute(“”“插入到ctm.services(id,Name,ServiceDescription,Version,Status,StatusDescription,WSDL,WADL,XSD,CreatedBy,CreatedOn,CreatedAt,UpdatedBy,UpdatedOn,UpdatedAt,deleted)值( ?,?,?,?,?,?,?,?,?,?,current_timestamp,?,null,null,null,?)“”“,'abcdefghijklmn','whatservice','testing','1.0 .0','active','','注意!!!这应该是一个模式文件上下文。但由于某种原因无法显示。所以我在这里输入垃圾信息','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 server。因此,错误消息必须来自SQL Server Native Client驱动程序。
我试图谷歌寻求解决方案,但找不到任何东西。以前是否有人遇到过同样的问题?
P.S。 我在Microsoft SQL Server Management Studio下尝试过相同的命令。它没有任何问题。所以问题可能来自ODBC驱动程序或ODBC驱动程序和pyodbc之间的不匹配。