I'd agree that if an import to a local table were in operation then a passthrough really would be the way to go for such a batch operation. (I presume you're not pushing the data out from SQL Server - but that to a local source would be hard to believe).
However for other scenarios exeuting the SP on the server is very often performed through an ADO connection.
On your code front, I see you're refering to a DSN.
While you want to do that then you're using the ODBC driver to establish your connection - is there a problem with the ODBC driver version I wonder. (I'd ordinarily say make sure you install the latest MDAC - but you're already limited in what you can do on these client machines).
Try the OLEDB provider anyway.
cnBE.ConnectionString = "Provider=SQLOLEDB;Data Source=MyServer;Integrated Security=SSPI;Initial Catalog=MyDB;"
See how you go.
FWIW I wouldn't recommend you Refresh the Parameters collection anyway.
You can get away with that in client side development (i.e. Access against Jet) as the query definition is local. But the Refresh of the collection is another trip to the server which you don't need (as you already know the name of your return parameter name - you need to to know the datatype too - but you should anyway of course).
Your code would then become...