【问题标题】:Python: Pyodbc execute stored procedure with parametersPython:Pyodbc 执行带参数的存储过程
【发布时间】:2015-12-15 18:33:17
【问题描述】:

我在使用 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 上看到的没有任何帮助。

【问题讨论】:

    标签: python sql-server stored-procedures pyodbc


    【解决方案1】:

    我认为缺少的是提交。对光标运行 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)
    

    【讨论】:

      【解决方案2】:

      我发现问题是由于没有打开自动提交引起的。 Pyodbc 默认将自动提交设置为 False。

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

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

      【讨论】:

        【解决方案3】:

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

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

        应该工作

        【讨论】:

        • 感谢您的回复。那没有用。我更新了问题以包含括号和我的存储过程。
        猜你喜欢
        • 2011-08-27
        • 1970-01-01
        • 1970-01-01
        • 2014-03-03
        • 2023-04-07
        • 2019-02-16
        • 1970-01-01
        • 1970-01-01
        • 2017-11-02
        相关资源
        最近更新 更多