Great job, Solomon!
That's definitely a feature which was missing in my opinion.
I think BCP is a very powerful and nice tool but it is much less flexible. XML is a way I use since now but it produces a large overhead. Anyway, the performance of XML vs. TVPs would be really interesting :-).
Some little things (maybe optimizations) about your C# code:
General )
Since only the "Normal" approach requires a DataTable all other methods could be optimized by using a simple object[] and a List<> .
OldSchoolImport )
Well, creating 3,000,000 instances of a SqlCommand object instead of creating just one, prepare it and just bind the new values should be more realistic usage 😉
Thanks for this work
Flo