0

我有一个 django 函数,它通过 pyodbc 调用 SQL Server 2008 中的存储过程,如下所示:

def new_user(self):
        # create a cursor
        cur = connection.cursor()
    try:
        cur.execute("{CALL sp_newPerson  (?,?,?,?,?)}",
                   (self.id, self.fname, self.lname, self.address))
        #returns 1 when there is a result set.
        #if cur.return_value == 1:        
        # grab the results
        results = cur.fetchall()
            return results
    finally:
            cur.close()

每当调用该函数时,我都会收到“error_message”:“在字符串格式化期间并非所有参数都被转换”

4

1 回答 1

2

似乎sp_newPerson()有 5 个参数(如果我正确计算 all的话?),但您尝试仅使用 4 个参数执行它,或者它有 4 个参数,但您又添加了一个?

cur.execute("{CALL sp_newPerson(?,?,?,?,?)}", (self.id, self.fname, self.lname, self.address, self.something))

或者:

cur.execute("{CALL sp_newPerson(?,?,?,?)}", (self.id, self.fname, self.lname, self.address))

编辑:

您似乎正在尝试使用带有 OUT 参数的函数或过程。

我没有 MS SQL 来检查它是否适用于 Python ODBC 准备调用。其他数据库也有问题。可能很难编写 Python ODBC 代码来获取返回值或 OUT 参数。从 C 或 Delphi ODBC 驱动程序在执行此类函数/过程之前分配缓冲区,以便可以填充它。在 Python 中,我不知道这是否可能。我发现 PreparedStatements 在 JDBC(我从 Jython 中使用)中工作,即使使用 JDBC-ODBC 桥,但 JDBC 使用专门的 API 来指定输入和输出参数。另请参阅我关于从 Oracle DB 调用函数的问题:如何通过 ODBC 检索 Oracle 数据库函数的结果?

我认为你能做的最好的就是使用解决方法。如果sp_newPerson()是一个函数:

  1. 将其转换为SELECT. 当函数更改数据库时(使用 INSERT、UPDATE 或 DELETE),它不能在某些数据库,尤其是 Oracle 中工作:

    cur.execute("SELECT sp_newPerson(?,?,?,?)", (self.id, self.fname, self.lname, self.address))
    for row in cur.fetchall(): 
        r = row[0]
    
  2. 将其转换为INSERT,当然您必须创建tmp表,清除它等:

    r = cur.execute("INSERT INTO tmp (new_person_id) VALUES (sp_newPerson(?,?,?,?))", (self.id, self.fname, self.lname, self.address))
    if r == 1:
        cur.execute("SELECT new_person_id FROM tmp")
        for row in cur.fetchall(): 
            r = row[0]
    
于 2012-09-19T07:16:20.950 回答