pymssql query

Tim Golden mail at timgolden.me.uk
Wed May 16 13:39:29 EDT 2007


m.biddiscombe at gmail.com wrote:
> Hi,
> 
> I'm trying to use pymssql to execute a stored procedure. Currently, I
> have an Excel spreadsheet that uses VBA in this manner:
> 
> Private Function CreateNewParrot(connDb As ADODB.Connection) As Long
>   Dim objCommand As ADODB.Command
>   Dim iParrot As Long
>   Dim bSuccess As Boolean
> 
>   Set objCommand = CreateObject("ADODB.Command")
>   objCommand.ActiveConnection = connDb
>   objCommand.CommandText = "create_new"
>   objCommand.CommandType = adCmdStoredProc
>   objCommand.Parameters.Refresh
>   On Error Resume Next
>   Err.Clear
>   objCommand.Execute
>   bSuccess = (Err.Number = 0)
>   On Error GoTo 0
>   If (bSuccess) Then
>     If (IsNull(objCommand("@parrot"))) Then
>       iParrot = 0
>     Else
>       iParrot = CLng(objCommand("@parrot"))
>     End If
>   Else
>     iParrot = 0
>   End If
>   Set objCommand = Nothing
>   CreateNewParrot = iParrot
> End Function

Depending on what you're after, why not transliterate
it into Python?

import win32com.client
command = win32com.client.Dispatch ("ADODB.Command")

etc.

> My attempts to translate this into a python script using pymssql have
> so far been fruitless. Here is what I have tried:
>>>> import pymssql
>>>> con = pymssql.connect(host='blah', user='blah', password='blah', database='blah')
>>>> cur = con.cursor()
>>>> command = 'exec create_new_parrot'
>>>> cur.execute(command, '@parrot')
> Traceback (most recent call last):
>   File "<stdin>", line 1, in ?
>   File "C:\Program Files\Python\lib\site-packages\pymssql.py", line
> 127, in execute
>     self.executemany(operation, (params,))
>   File "C:\Program Files\Python\lib\site-packages\pymssql.py", line
> 153, in executemany
>     raise DatabaseError, "internal error: %s" % self.__source.errmsg()
> pymssql.DatabaseError: internal error: SQL Server message 8114,
> severity 16, state 5, procedure create_new_parrot, line 0:
> Error converting data type nvarchar to int.
> DB-Lib error message 10007, severity 5:
> General SQL Server error: Check messages from the SQL Server.

Well, I'm not connected to a SQL Server here (so this
is untested) but I don't believe pymssql handles
stored procedure calls differently from any other
SQL. Which is a problem here because, as far as I
can make out from your code above, @parrot is an
output parameter for the create_new stored proc.
Is that right? If it's an input-only param, then
just do the usual:

import pymssql
db = pymssql.connect (...)
q = db.cursor ()
q.execute (
   "EXECUTE create_new @parrot = %s",
   ["parrot-thing"]
)

I'm not aware of any of the MSSQL dbapi
modules which allow for output parameters
in stored procedures. pyodbc (one of the most
recent entrants) tantalisingly offers a .callproc
but then comments "not yet supported". If the ADO
approach works, I'd use that if I were you!

TJG



More information about the Python-list mailing list