调用存储过程python

时间:2012-02-23 18:49:43

标签: python sql-server stored-procedures pyodbc

我正在编写一个脚本来提取/更新MsSQL服务器,我可以让我的一个存储过程调用工作但不是我在updateDB函数中的第二个。这是我的代码脚本运行正常没有错误代码

import pyodbc 
import json
import argparse
import cgi, cgitb


#GLOBALS
    BUILDCODE = " "
    deptCODE = 0
    bldgCODE = " "
def getCodes(conn, building, department):
    #just for testing
    departmentt = 'COMPUTER SCIENCE'
    buildingt = 'PEARCE HALL'


    #geting the building code from db
    cursorBuild = conn.cursor()
    cursorBuild.execute("select * from dbo.building where name = '%s'" % buildingt)
    bldgRow = cursorBuild.fetchall() 
    cursorBuild.close()
    bldgCode = bldgRow.pop(0)

    global bldgCODE
    bldgCODE = bldgCode.code


    #getting the dept code
    cursorDept = conn.cursor()
    cursorDept.execute("execute dbo.GetCode_ByDepartment @department = '%s'" % departmentt)
    deptRow = cursorDept.fetchall()
    cursorDept.close()
    deptCode = deptRow.pop(0)

    global deptCODE
    deptCODE = deptCode.code
    print type(deptCODE)
    print deptCODE

    #returning the values
    return (bldgCode, deptCode)

    def updateDB(conn, tag, room, updater):
    #updating the database
    updateCursor = conn.cursor()

    print deptCODE
    print bldgCODE
        #this will pass params just has them hard codded for testing
    conn.execute("exec dbo.UpdateCheck_In @room = '400', @building = 'PE', @department = 307, @global_id = 'bacon', @tag = '120420'")


if __name__ == "__main__":
    #connectin to the db with SQL Authentification
    conn = pyodbc.connect(driver = '{SQL Server}', server = '(local)',
        database = 'Inventory', uid = 'sa', pwd = 'p@$$w0rd123')

#checking to see if you connected to the db or not 
    if (conn == False):
        print "Error, did not connect to the database"
    else:
        #NEEDS THIS cgitb.enable
        cgitb.enable()
        # Create instance of FieldStorage   
        form = cgi.FieldStorage()

        #get the data from the url that called it 
        tag = form.getvalue('tagnum')
        building = form.getvalue('build')
        roomNum = form.getvalue('room')
        department = form.getvalue('dept')
        updater = form.getvalue('update')

        #check to see if item is in the db 
        itemIsThere = conn.cursor()
        itemIsThere.execute("select * from dbo.check_in where tag = '120420';")
        print itemIsThere
        itemIsThere.close()
        #if the item in in the inventory 
        if (itemIsThere != None):
                #getting the codes
            getCodes(conn, building, department)
            #calling the update function
            updateDB(conn, tag, roomNum, updater)
        else :
                pass

    conn.close()

2 个答案:

答案 0 :(得分:8)

运行更新程序后提交更改:

...
#this will pass params just has them hard coded for testing
conn.execute("exec dbo.UpdateCheck_In @room = '400', @building = 'PE', @department = 307, @global_id = 'bacon', @tag = '120420'")
conn.commit()

默认情况下,pyodbc.connect() autocommit已停用

答案 1 :(得分:0)

每个人都找到了答案,那是因为我为MsSQL 2008指定了旧驱动程序而不是更新的驱动程序继承代码

    conn = pyodbc.connect(driver = '{SQL Server Native Client 10.0}', server = '(local)',            database = 'Inventory', uid = 'sa', pwd = 'p@$$w0rd123',autocommit=True)