Python:Pyodbc使用参数执行存储过程

时间:2015-12-15 18:33:17

标签: python sql-server stored-procedures pyodbc

我在使用Python 3.4执行SQL Server存储过程时遇到问题。我导入Pyodbc来创建连接,并且有几行应该将数据发送到存储过程。

我的Python:

sql = "exec <stored_procedure_name> @int1=?, @int2=?, @string1=?, @int3=?"
params = (irow[0], irow[15], irow[2], irow[6])
cursor.execute(sql, params)

存储过程:

  @int1 int,
  @int2 int,
  @string1 varchar(10),
  @int3 int
AS
BEGIN
  --Do stuff
END

执行脚本时,我没有在命令提示符中出现错误。当我打印

print(sql, params)

我得到一个奇怪的结果。没有任何内容插入到存储过程中作为目标的表中。

exec <stored_procedure_name> @int1=?, @int2=?, @string1=?, @int3=? (0, 0, 'string', 0)

我是Python的新手,所以任何见解都会受到高度赞赏。我在SO上看到的任何东西都没有帮助。

3 个答案:

答案 0 :(得分:3)

我认为缺少的是提交。对光标运行commit方法:

cursor.execute(sql, params)
cursor.commit()

或在创建连接时设置autocommit=True,如同提供的其他答案一样。该连接用于创建游标,因此在调用execute()时,自动提交行为是固有的:

cnxn = pyodbc.connect(driver="<driver>", server="<server>", 
                      database="<database>", uid="<username>", pwd="<password>", 
                      autocommit=True)

答案 1 :(得分:2)

我发现问题是由未启用自动提交引起的。 Pyodbc默认将autocommit设置为False。

要启用自动提交,您可以声明连接,如:

cnxn = pyodbc.connect(driver="<driver>", server="<server>", database="<database>", uid="<username>", pwd="<password>", autocommit=True)

答案 2 :(得分:0)

参数通常作为元组传递,所以

params = (irow[0], irow[15], irow[2], irow[6])

应该有效