Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyodbc未引发SQL Server错误_Python_Sql Server_Pyodbc - Fatal编程技术网

Python pyodbc未引发SQL Server错误

Python pyodbc未引发SQL Server错误,python,sql-server,pyodbc,Python,Sql Server,Pyodbc,我试图使用pyodbc(使用Python 2.7)调用存储过程,将记录插入SQL Server 2012表中。我经过一张临时桌子 我转储了我的sql,当通过sql Server管理控制台执行时,它生成以下外键错误: Msg 547, Level 16, State 0, Procedure spInsertBondTickerValues, Line 26 The INSERT statement conflicted with the FOREIGN KEY constraint "FK__B

我试图使用
pyodbc
(使用Python 2.7)调用存储过程,将记录插入SQL Server 2012表中。我经过一张临时桌子

我转储了我的sql,当通过sql Server管理控制台执行时,它生成以下外键错误:

Msg 547, Level 16, State 0, Procedure spInsertBondTickerValues, Line 26
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__BondTickerValue__756D6ECB".
The conflict occurred in database "QuantDev", table "dbo.Tickers".
The statement has been terminated.
但是,
pyodbc
没有引发异常。我如何测试生成的游标或连接以知道发生了问题,以及如何获得错误消息

多谢各位

编辑以下是完整的sql文本:

DECLARE @rawTbl [dbo].TickerValueTableType
INSERT INTO @rawTbl (Ticker, BBName, LastValue, ValueTime, SourceDescr) VALUES
('IBM', 'Equity', 179.230000, '2013-11-01 00:00:00.000000', 'Bloomberg'),
('SPX', 'Index', 1803.710000, '2013-12-10 00:00:00.000000', 'Bloomberg')
EXEC [dbo].spInsertBondTickerValues @rawTbl
编辑2以下是相关的Python代码:

def execSQLwithCommit(self, sql):
    cursor = self.conn.cursor()
    cursor.execute(sql)
    self.conn.commit()
之前通过以下方式进行连接:

self.conn = pyodbc.connect(app      = appName,
                           driver   = '{SQL Server Native client 11.0}',
                           server   = server,
                           database = db,
                           Trusted_Connection = 'yes')

我能够使用以下代码重新创建您的问题,该代码以静默方式失败:

导入pyodbc
cnxn=pyodbc.connect('DSN=myDb;')
cursor=cnxn.cursor()
sql=”“”
声明@rawTbl dbo.ClientAddressInputType;
插入@rawTbl(ClientID,Addr1)值
(2,“higgy”),
(3"jiggy");;
EXEC dbo.AddClientAddress@rawTbl
"""
cursor.execute(sql)
cursor.commit()
cnxn.close()
但是,我可以通过简单地添加
SET NOCOUNT ON,让代码抛出适当的
IntegrityError
异常
sql
字符串的开头:

导入pyodbc
cnxn=pyodbc.connect('DSN=myDb;')
cursor=cnxn.cursor()
sql=”“”
不计数;
声明@rawTbl dbo.ClientAddressInputType;
插入@rawTbl(ClientID,Addr1)值
(2,“higgy”),
(3"jiggy");;
EXEC dbo.AddClientAddress@rawTbl
"""
cursor.execute(sql)
cursor.commit()
cnxn.close()
导致

回溯(最近一次呼叫最后一次):
文件“C:\Users\Gord\Desktop\pyOdbc.py”,第12行,在
cursor.execute(sql)
IntegrityError:('23000','[23000][Microsoft][SQL Server Native Client 10.0][SQL Server]INSERT语句与外键约束“FK_ClientAddresses_Client”冲突。冲突发生在数据库“myDb”、表“dbo.Clients”、列“ClientID\”(547)(SQLExecDirectW);[01000][Microsoft][SQL Server Native Client 10.0][SQL Server]语句已终止。(3621)“”

请使用pyodbc.Cursor实例化和执行的相关python代码进行更新。@beargle完成。谢谢。您的SQL脚本似乎没有分号。我不知道是否已对其进行了解析。SQL Server控制台可能足够聪明,可以对其进行解析,但驱动程序是否同样聪明?我还怀疑该脚本有三个不同的stat元素,每个元素可能需要一个单独的
。执行
调用。@9000当没有外键错误时,调用会正确插入所有内容。不要认为是分号或多个语句。分离它们可能会提供一种测试方法,但我希望
pyodbc
会出现错误情况……谢谢,我会尝试重新生成,如果我t工作,将接受。非常感谢您的帮助,我真的很感激。您的解决方案在多年后的数小时调试后帮助了我。谢谢!但有没有任何解释说明为什么会这样做?这是pyodbc的错误?是SQL server的错误?还是预期的行为?@Cnoor0171-这就是ODBC在d时的工作方式使用TDS协议。如果不启用
设置NOCOUNT;
将返回两个“结果”:(1)由INSERT生成的行计数,以及(2)EXEC的结果,这是一个错误。第一个结果不是错误,我们只能“查看”调用时EXEC的错误。使用
将NOCOUNT设置为ON;
EXEC的错误是第一个(也是唯一一个)结果返回,所以pyodbc会立即注意到它。@GordThompson因此,如果在同一个sql字符串中有多个语句,并且除第一个之外的任何语句都有错误,则在调用
.nextset
之前不会报告它?这有点吓人,但很高兴知道。谢谢!