You are partially right but the problem is more complex.
In my case, a stored procedure is called. This procedure takes input parameters and creates a dynamic SQL statement. This generated statement looks like this:
|SELECT vw.* from someView as vw WHERE ID in (Select IntValue from dbo.CsvToInt('1;2;3'))
The csv string ('1;2;3') comes directly from a parameter.
It is finally executed as: execute (@query)
(@query contains this generated statement)
dbo.CsvToInt is a table-value user function that converts numbers given as a semicolon separated string to a table of integer values.
If I supply an invalid parameter (e.g. 'aqq' instead of '1;2;3') the procedure throws an exception: "Conversion failed when converting the varchar value 'aqq' to data type int.". After this exception my application behaves as I've described - a query executed in the "catch" section fails.
But if I slightly modify the procedure, for example to refer to a nonexisting view (".... from someViewX ....") the procedure throws another exeception: "Invalid object name 'someViewx'." (regardless the quality of the parameters). And after this exception my "catch" section runs succesfully.
I've also done some other experiment, replacing OpenAccess with standard connection, data adapter and other objects from System.Data.SqlClient namespace. In this case, my procedure supplied with "aqq" has also failed, of course, but the "catch" section has been able to execute the required query.
Think it over, please.