I need to execute a non-query but have it process through the ExecFilter.
The BCL method ExecuteNonQuery obviously doesn’t use the filter.
OrmLiteConfig.ExecFilter = new SpecialExecFilter();
using (var cmd = db.SqlProc("SomeSp", new {
A = a,
B = b
}))
{
var outputParam = cmd.AddParam("OutputParam", null, ParameterDirection.Output);
cmd.ExecuteNonQuery(); // Doesn't call ExecFilter :(
return outputParam.Value;
}
I was looking for an SS extension method like ExecNonQuery, but can’t find anything appropriate.
That method is internal, but even if it was public I can’t see that it would call the ExecFilter.
Generally, should the ExecFilter be called for all OrmLite methods? Maybe I’m misunderstanding it’s purpose. I need something to happen before and after every query (select, insert, exec sp, whatever).
It’s not available at the IDbCommand level, the managed Exec filter is what creates the creates the command that’s used, so your top-level SqlProc would use it, but not your cmd callback.
SqlProc ends up using the non-virtual overload so the custom behaviour in my filter isn’t executed. I think this makes sense as the command isn’t actually executed by OrmLite.
Can OrmLite be extended to allow the SqlProc prepared command be executed via the ExecFilter?
I’ve made all methods on OrmLiteExecFilter virtual in this commit which is available from v4.0.61 on MyGet.
If that still doesn’t do what you want can you send a PR that does, as I’m having trouble following as SqlProc already calls db.Exec() which is executed on the Exec filter (like all other APIs) and the only API’s on IOrmLiteExecFilter expose is a db connection not a command so you may instead need to create your own extension method, e.g. IDbCommand.NonQueryExec() and have it apply the custom logic you want before you call ADO.NET’s ExecuteNonQuery().