0

次のように、pyodbc を介して SQL Server 2008 でストアド プロシージャを呼び出す django 関数があります。

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

5つの引数があるようですsp_newPerson()(すべてを正しくカウントし?た場合)が、4つのパラメーターのみで実行しようとしたか、4つのパラメーターがありますが、さらに1つ追加しました?

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パラメータで関数またはプロシージャを使用しようとしているようです。

PythonODBCで準備された呼び出しで機能するかどうかを確認するMSSQLがありません。他のデータベースには問題があります。戻り値またはOUTパラメータを取得するPythonODBCコードを作成するのはおそらく難しいでしょう。CまたはDelphiから、ODBCドライバーは、そのような関数/手順を実行する前にバッファーが割り当てられるため、埋めることができます。Pythonでは、それが可能かどうかはわかりません。PreparedStatementsはJDBC-ODBCブリッジでも、JDBC(Jythonから使用)で機能することがわかりましたが、JDBCは特殊なAPIを使用して入力パラメーターと出力パラメーターを指定します。Oracle DBからの関数の呼び出しに関する私の質問も参照してください:ODBCを介してOracleデータベース関数の結果を取得するにはどうすればよいですか?

最善の方法は、回避策を使用することだと思います。sp_newPerson()関数の場合:

  1. に変換しSELECTます。一部のデータベース、特にOracleでは、関数がデータベースを変更する場合(INSERT、UPDATE、またはDELETEを使用)、機能しません。

    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 に答える