In theory, you cannot execute code that would corrupt your database unless you are somehow touching some of the MSysx tables or if you somehow diddle with the definition collections (TableDefs/AllTables, QueryDefs/AllQueries, etc.). Or performing some other type of skullduggery that should not occur in a production database.
That is because a corrupt database is corrupt at a metadata level. A database having no data is NOT corrupt - it is just empty. Your message capture in the first post is not data-related. There is something wrong with the project itself.
There are no functions of which I am aware that can touch the metadata without touching the hidden system tables to do it (but see the bottom of this post). Having said that you can't do it, it is possible that you might somehow start something in the main flow of some form or report and then have something go off with a timer on the launcher form that would force an application event that would somehow interrupt the process at a bad time and lead to corruption.
I won't say that a "No Data" event can absolutely never corrupt a database - but the code would have to diddle with Access infrastructure to do it. You would know if you had done something like that.
As to the question of not printing a report if no data can be found, I usually built my reports in two stages. First, based on user selections, I created a WHERE clause that would only show the users what they requested. I would tack that onto a SELECT...FROM... string that was constant per report. Since I had the WHERE clause handy, the code that launched the report first tested for whether a DCOUNT based on the given criteria would return any number other than zero. If I got back zero, I never executed the second step, which was to reset the report's .Recordsource and then open the report in the appropriate mode.
Now - here's a shot in the dark. I wouldn't be surprised to find out that you don't have a situation like this because it is a type of "Damn the torpedos, full speed ahead" program style that is not good for production code. You would actually have to work at it to do this sort of thing.
It is at least theoretically possible to call a function or sub in which you have one or more arguments passed by reference that should have been passed by value - and then pass a bad value. This is unlikely for a pure Access function that you wrote yourself, but I could imagine it for something called from an external library where the declaration was not quite right. IF you issue this bad type of call and IF warnings are turned off at the time and IF you have an On Error Resume Next in effect at the time, you COULD theoretically screw the program stack to tears, or you could hit random elements in the object code of the compiled modules, which are actually some sort of BLOB (binary large object) in a compiled database.
Since you believe this error was associated with the "No Data" event, it should be possible to narrow down your search. However, if you have the above situation anywhere in your code, you could leave a mess behind and then the "No Data" event could trip over the mess. But removing the "No Data" event simply means something else has the opportunity to trip later.