2012-02-23 20 views
8

Sto scrivendo uno script per estrarre informazioni/aggiornare un server MsSQL e posso ottenere il mio una chiamata di procedura memorizzata per funzionare ma non il mio secondo nella funzione updateDB. qui è il mio codice dello script funziona benissimo senza i codici di erroreChiamare una procedura memorizzata python

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 = '[email protected]$$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() 
+0

Qual è la differenza tra 'exec' e' execute'? –

+0

niente entrambi fanno la stessa cosa – user1229126

+0

Se si stampano i risultati bldgRow e deptRow cosa ottieni? –

risposta

1

trovato la risposta a tutti , è perché ho specificato il driver legacy invece di quello più recente per MsSQL 2008 ecco il codice

conn = pyodbc.connect(driver = '{SQL Server Native Client 10.0}', server = '(local)',   database = 'Inventory', uid = 'sa', pwd = '[email protected]$$w0rd123',autocommit=True) 
+1

Hai anche aggiunto "autocommit = True", che è la soluzione più probabile, come menzionato da @beargle. – Manfre

5

confermare le modifiche dopo la procedura di aggiornamento viene eseguito:

... 
#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() 

In pyodbc.connect()autocommit è disabilitato per default

Problemi correlati