I understand the principles of design as follows:
If we need to describe only the contract - we choose the interface. So we can give the opportunity to apply this contract without restricting the programmer in its implementation (the interface does not impose restrictions on inheritance).
If we have some kind of mandatory code (for example, the "template method" pattern) and we want to impose its use, we choose an abstract class. Here the programmer will be forced to inherit from it.
If there are no requirements to "impose", then we describe the contract in the form of an interface and optionally we can generate abstract class (s) for the "boilerplate code"
With regard to DbCommand , there is a kind of implementation in the form of a heap of attached attributes on properties and so on, which is common to SqlCommand and in OleDbCommand , but the IDbCommand interface leaves freedom to those who do not need it.
In practice, it is unlikely that anyone will use IDbCommand , but for describing a contract, the interface is preferable, so we have an interface (as a contract description) and an abstract class (as a base class that allows you to optionally use common functionality).
ps: these principles for public code. In its own code, interfaces (abstract classes) should be born only when needed.