This question is subjective. Everything *can* be used - The choice really depends on the use-case and the list of reasons/caveats is too long to make a worthy post here. I suggest you find a tutorial or specification for which functions are available via ODBC and then another for which are available through Microsoft.Data.SQLite and then System.Data.SQLite. You might find that the things you wish to do are very well and fully available through any of these, in which case using the one with the smallest footprint makes sense. If you need more, like in-depth DB manipulation, multiple-connection concurrency, control over the compile-options, or be able to include Virtual tables, or your own User-Defined-Functions (the list goes on and on) - it's imperative to use either the engine directly or wrappers that expose the broadest/newest host of functions. Either way, you first have to know what you need, and then learn about the options, then you can decide which option will work for you.