<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlite.phxsoftware.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>How To</title><link>http://sqlite.phxsoftware.com/forums/10.aspx</link><description>Sample code and instructions for working with SQLite.NET</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Fastest Bulk Inserts</title><link>http://sqlite.phxsoftware.com/forums/thread/465.aspx</link><pubDate>Thu, 12 Jan 2006 16:32:50 GMT</pubDate><guid isPermaLink="false">fa762dca-388a-4e6a-93ef-b5a7a7439be2:465</guid><dc:creator>Robert Simpson</dc:creator><slash:comments>0</slash:comments><comments>http://sqlite.phxsoftware.com/forums/thread/465.aspx</comments><wfw:commentRss>http://sqlite.phxsoftware.com/forums/commentrss.aspx?SectionID=10&amp;PostID=465</wfw:commentRss><description>&lt;P&gt;What I'm going to demonstrate here applies not just to SQLite, but to all ADO.NET providers.&amp;nbsp; I'm going to demonstrate bulk inserting data using a DbCommandBuilder, DbDataAdapter and a DataTable, as well as direct bulk inserting data using a hand-crafted parameterized insert.&amp;nbsp; There are a few tricks along the way that will speed up your inserts tremendously, so don't skip!&lt;/P&gt;
&lt;P&gt;The following examples assume a table has been created using the following command:&lt;BR&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;CREATE TABLE TestCase (ID INTEGER PRIMARY KEY, MyValue INTEGER)&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;The DataTable/DbDataAdapter/DbCommandBuilder Method&lt;/FONT&gt;&lt;BR&gt;&lt;/STRONG&gt;This method is not the fastest method of bulk inserting data, but it is commonly used and has its place, so I will demonstrate it here and give some tips on how to cut the insert time in half!&lt;/P&gt;
&lt;P&gt;First, it is a common misconception that the DbCommandBuilder is unsuitable for production use.&amp;nbsp; I disagree, and think for simple inserts it is a great way to avoid generating your own SQL.&amp;nbsp; Since it is a jack of all trades, it therefore is a master of&amp;nbsp;none, and may not be suitable for every circumstance.&lt;/P&gt;
&lt;P&gt;A common use of the DbCommandBuilder might be as follows:&lt;/P&gt;
&lt;TABLE&gt;

&lt;TR&gt;
&lt;TD style="BACKGROUND-COLOR: lightgrey"&gt;&lt;PRE&gt;&lt;FONT size=1&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&lt;FONT size=1&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;internal&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;static&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; &lt;FONT color=#000000&gt;CommandBuilderTest1&lt;/FONT&gt;(&lt;FONT color=#008080&gt;DbProviderFactory&lt;/FONT&gt; fact, &lt;FONT color=#008080&gt;DbConnection&lt;/FONT&gt; cnn)&lt;/P&gt;&lt;P&gt;&lt;FONT color=#000000&gt;{&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;  using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbTransaction&lt;/FONT&gt; dbTrans = cnn.BeginTransaction())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;  {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;    using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbDataAdapter&lt;/FONT&gt; adp = fact.CreateDataAdapter())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;    {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;      using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbCommand&lt;/FONT&gt; cmd = cnn.CreateCommand())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;      {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        cmd.Transaction = dbTrans;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        cmd.CommandText = &lt;FONT color=#800000&gt;"SELECT * FROM TestCase WHERE 1 = 2"&lt;/FONT&gt;;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        adp.SelectCommand = cmd;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;        using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbCommandBuilder&lt;/FONT&gt; bld = fact.CreateCommandBuilder())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;          bld.DataAdapter = adp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;          using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DataTable&lt;/FONT&gt; tbl = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#008080&gt;DataTable&lt;/FONT&gt;())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;          {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;            adp.Fill(tbl);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;            for&lt;/FONT&gt; (&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; n = 0; n &amp;lt; 10000; n++)&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;            {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#008080&gt;              DataRow&lt;/FONT&gt; row = tbl.NewRow();&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;              row[1] = n;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;              tbl.Rows.Add(row);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;            }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;            adp.Update(tbl);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;            dbTrans.Commit();&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=1&gt;&lt;P&gt;&lt;FONT size=2&gt;          }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;      }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;    }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;  }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;That code will execute on my machine in roughly 1 second.&amp;nbsp; Notice the only SQL I specified was the Select Command.&amp;nbsp; The DbCommandBuilder automatically generated an insert statement behind the scenes.&amp;nbsp; At first you might be impressed.&amp;nbsp; 10,000 rows in 1 second doesn't seem too shabby, does it?&amp;nbsp; What if, by a mere 4 lines of code, I was able to cut that time down to about 300ms?&amp;nbsp; I'll demonstrate:&lt;/P&gt;
&lt;TABLE&gt;

&lt;TR&gt;
&lt;TD style="BACKGROUND-COLOR: lightgrey"&gt;&lt;PRE&gt;&lt;FONT size=1&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&lt;FONT size=1&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;internal&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;static&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; &lt;FONT color=#000000&gt;CommandBuilderTest2&lt;/FONT&gt;(&lt;FONT color=#008080&gt;DbProviderFactory&lt;/FONT&gt; fact, &lt;FONT color=#008080&gt;DbConnection&lt;/FONT&gt; cnn)&lt;/P&gt;&lt;P&gt;&lt;FONT color=#000000&gt;{&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;  using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbTransaction&lt;/FONT&gt; dbTrans = cnn.BeginTransaction())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;  {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;    using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbDataAdapter&lt;/FONT&gt; adp = fact.CreateDataAdapter())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;    {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;      using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbCommand&lt;/FONT&gt; cmd = cnn.CreateCommand())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;      {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        cmd.Transaction = dbTrans;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        cmd.CommandText = &lt;FONT color=#800000&gt;"SELECT * FROM TestCase WHERE 1 = 2"&lt;/FONT&gt;;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        adp.SelectCommand = cmd;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;        using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbCommandBuilder&lt;/FONT&gt; bld = fact.CreateCommandBuilder())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;          bld.DataAdapter = adp;          &lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT color=#008000&gt;&lt;P&gt;&lt;FONT size=2&gt;          // 3 lines of new code (+1 closing brace).  We create a clone of the insert command&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;          // and followup by setting the DbCommandBuilder's DataAdapter property to null&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;          using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (adp.InsertCommand = (&lt;FONT color=#008080&gt;DbCommand&lt;/FONT&gt;)((&lt;FONT color=#008080&gt;ICloneable&lt;/FONT&gt;)bld.GetInsertCommand()).Clone())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;          {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;            bld.DataAdapter = null;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;            using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DataTable&lt;/FONT&gt; tbl = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#008080&gt;DataTable&lt;/FONT&gt;())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;            {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;              adp.Fill(tbl);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;              for&lt;/FONT&gt; (&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; n = 0; n &amp;lt; 10000; n++)&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;              {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#008080&gt;                DataRow&lt;/FONT&gt; row = tbl.NewRow();&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;                row[1] = n;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;                tbl.Rows.Add(row);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;              }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;              adp.Update(tbl);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;              dbTrans.Commit();&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=1&gt;&lt;P&gt;&lt;FONT size=2&gt;            }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;          }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;      }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;    }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;  }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;The above code now executes on my machine in around 300ms.&amp;nbsp; Why?&amp;nbsp; What's the significance of what I've done here?&amp;nbsp; It's deviously subtle, but very important and goes to the core of understanding the underpinnings of ADO.NET.&amp;nbsp; You see, the DbCommandBuilder tries to be as convenient as possible for you, and often to your own detriment.&amp;nbsp; Once a DbCommandBuilder has a DataAdapter, the DbCommandBuilder will connect to the DataAdapter's OnUpdating event, and if you happen to generate an UPDATE or an INSERT or a DELETE, and the DataAdapter doesn't have those commands, DbCommandBuilder will automatically generate them for the DataAdapter.&lt;BR&gt;Why is that important?&amp;nbsp; Because for every insert we do in the test, we're raising an event that the DbCommandBuilder processes.&amp;nbsp; That's 10,000 list lookups and 10,000 delegate callbacks.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Bottom line&lt;/STRONG&gt;:&amp;nbsp; If you already know you're going to do an insert, update or delete, create your DbCommandBuilder, clone the commands and assign them to the DataAdapter, then destroy the DbCommandBuilder.&amp;nbsp; Your inserts updates and deletes will love you for it.&lt;/P&gt;
&lt;P&gt;Lets modify example 2 slightly so we can &lt;STRONG&gt;retrieve the primary key on the insert&lt;/STRONG&gt;.&amp;nbsp; This is a great little trick, and gets around a design issue with DbCommandBuilder (I'll explain after the sample):&lt;/P&gt;
&lt;TABLE&gt;

&lt;TR&gt;
&lt;TD style="BACKGROUND-COLOR: lightgrey"&gt;&lt;PRE&gt;&lt;FONT size=1&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&lt;FONT size=1&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;internal&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;static&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; &lt;FONT color=#000000&gt;CommandBuilderTest3&lt;/FONT&gt;(&lt;FONT color=#008080&gt;DbProviderFactory&lt;/FONT&gt; fact, &lt;FONT color=#008080&gt;DbConnection&lt;/FONT&gt; cnn)&lt;/P&gt;&lt;P&gt;&lt;FONT color=#000000&gt;{&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;  using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbTransaction&lt;/FONT&gt; dbTrans = cnn.BeginTransaction())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;  {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;    using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbDataAdapter&lt;/FONT&gt; adp = fact.CreateDataAdapter())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;    {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;      using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbCommand&lt;/FONT&gt; cmd = cnn.CreateCommand())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;      {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        cmd.Transaction = dbTrans;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        cmd.CommandText = &lt;FONT color=#800000&gt;"SELECT * FROM TestCase WHERE 1 = 2"&lt;/FONT&gt;;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        adp.SelectCommand = cmd;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;        using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbCommandBuilder&lt;/FONT&gt; bld = fact.CreateCommandBuilder())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;          bld.DataAdapter = adp;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT color=#008000&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;          using&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; (adp.InsertCommand = (&lt;FONT color=#008080&gt;DbCommand&lt;/FONT&gt;)((&lt;FONT color=#008080&gt;ICloneable&lt;/FONT&gt;)bld.GetInsertCommand()).Clone())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;          {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;            &lt;FONT color=#008000&gt;// These two lines modify the insert command to return the newly inserted rowid&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;            adp.InsertCommand.CommandText += &lt;FONT color=#800000&gt;";SELECT last_insert_rowid() AS [ID]"&lt;/FONT&gt;;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;            adp.InsertCommand.UpdatedRowSource = &lt;FONT color=#008080&gt;UpdateRowSource&lt;/FONT&gt;.FirstReturnedRecord;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;            bld.DataAdapter = null;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;            using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DataTable&lt;/FONT&gt; tbl = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#008080&gt;DataTable&lt;/FONT&gt;())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;            {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;              adp.Fill(tbl);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;              for&lt;/FONT&gt; (&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; n = 0; n &amp;lt; 10000; n++)&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;              {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#008080&gt;                DataRow&lt;/FONT&gt; row = tbl.NewRow();&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;                row[1] = n;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;                tbl.Rows.Add(row);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;              }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;              adp.Update(tbl);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;              dbTrans.Commit();&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=1&gt;&lt;P&gt;&lt;FONT size=2&gt;            }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;          }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;      }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;    }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;  }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;Because we cloned the DbCommandBuilder's InsertCommand, we're free to modify it as we desire.&amp;nbsp; If you tried this using the default InsertCommand that DbCommandBuilder generates, you'd find that the DbCommandBuilder would've reverted it back to its original state behind the scenes.&amp;nbsp; See &lt;A href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;q310366"&gt;this MSDN article &lt;/A&gt;describing the issue.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;Fastest universal way to insert data using standard ADO.NET constructs&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;Now that the slow stuff is out of the way, lets talk about some hardcore bulk loading.&amp;nbsp; Aside from SqlBulkCopy and specialized constructs involving ISAM or custom bulk insert classes from other providers, there is simply no beating the raw power of ExecuteNonQuery() on a parameterized INSERT statement.&amp;nbsp; I will demonstrate:&lt;/P&gt;
&lt;TABLE&gt;

&lt;TR&gt;
&lt;TD style="BACKGROUND-COLOR: lightgrey"&gt;&lt;PRE&gt;&lt;FONT size=1&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;internal&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;static&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; FastInsertMany(&lt;FONT color=#008080&gt;DbConnection&lt;/FONT&gt; cnn)&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;{&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;  using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbTransaction&lt;/FONT&gt; dbTrans = cnn.BeginTransaction())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;  {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;    using&lt;/FONT&gt; (&lt;FONT color=#008080&gt;DbCommand&lt;/FONT&gt; cmd = cnn.CreateCommand())&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;    {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;      cmd.CommandText = &lt;FONT color=#800000&gt;"INSERT INTO TestCase(MyValue) VALUES(?)"&lt;/FONT&gt;;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#008080&gt;      DbParameter&lt;/FONT&gt; Field1 = cmd.CreateParameter();&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;      cmd.Parameters.Add(Field1);&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;      for&lt;/FONT&gt; (&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; n = 0; n &amp;lt; 100000; n++)&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;      {&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        Field1.Value = n + 100000;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;        cmd.ExecuteNonQuery();&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;      }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;    }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;    dbTrans.Commit();&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;  }&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;Simple, elegant, clean.&amp;nbsp; 100,000 inserts on my machine in 1.4 seconds.&amp;nbsp; Yes, that's 10 times more inserts than the DataAdapter/DbCommandBuilder/DataTable method, and at very nearly the same speed as example 1!&lt;/P&gt;
&lt;P&gt;Do not, under any circumstances, bulk insert data by building your own command text over and over and over again.&amp;nbsp; That is the surest way to drag performance into the dirt.&amp;nbsp; Build your CommandText one time, build your parameters one time, and set their values over and over and over instead.&amp;nbsp; SQLite runs much faster, SQL Server runs much faster, and every database known to mankind will run much faster with a prepared, parameterized insert statement.&lt;/P&gt;
&lt;P&gt;Enjoy your inserting!&lt;/P&gt;
&lt;P&gt;Robert&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item></channel></rss>