1

我有一个版本为 10.50.4000 的 SQL 服务器。我使用 SQL Server Native Client 11.0 驱动程序通过 pyodbc 从 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 服务的模式。我已经阅读了架构文件并将其存储到一个字符串中。但是当我尝试将记录插入数据库服务器时,我收到以下错误消息:

Traceback(最近一次调用最后一次):文件“”,第 1 行,在 pyodbc.DataError 中:('22001','[22001] [Microsoft][SQL Server Native Client 11.0]String data,右截断(0)(SQLExecDirectW) ')

这是我执行的命令:

cursor.execute("""insert into ctm.services (id, Name, ServiceDescription, Version, Status,StatusDescription, WSDL, WADL, XSD, CreatedBy, CreatedOn, CreatedAt, UpdatedBy, UpdatedOn,UpdatedAt, deleted) values(?, ? , ?, ?, ?, ?, ?, ?, ?, ?,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 server。所以错误信息一定来自 SQL server Native Client 驱动。

我试图用谷歌搜索解决方案,但找不到任何东西。有没有人遇到过同样的问题?

PS 我曾在 Microsoft SQL Server Management Studio 下尝试过相同的命令。它没有任何问题。所以问题可能来自 ODBC 驱动程序或 ODBC 驱动程序和 pyodbc 之间的不匹配。

4

0 回答 0