Q:

Inserting many rows into SQL Server 2000 via SqlCommand in .NET - NOT updating the sysindexes (rows) properly

I am calling an insert method about 2000 times in a row (through a foreach loop in C#). Everything inserts into the table just fine, but the sysindexes rowcnt for that table does not update properly.
Let's say that I call the insert method 2100 times in that foreach loop, the rowcnt from sysindexes table for <table> now says 2085. But if I do a select count(1) from <table> I get the proper number of records (2100).
The number that I get from the rowcnt usually varies, but it always around the correct number of rows.
We are running SQL Server 2000 - yes I know, it is 15 years old and that might have something to do with it. I did see that sysindexes for SQL Server 2000 can be a little shaky, and they recommend using other views rather than that one if you have a never version, but we don't.
The really silly part is that if I run that insert method just one time, and insert just one record, it updates the sysindexes rows & rowcnt to the proper number. Isn't that something?  
The code below shows the method that is being called all those times in a row. Any help is greatly appreciated. I make the insert string and then I send it to the method to run the query - yes I know how to use Command.Parameters and I should not hard code values into a string, but I replicated another process without doing it properly just to test it and it gives me the same results/problem that I am asking about. 

Insert Statement is as follows: INSERT INTO (item_no, totalTransactions, compileDate) VALUES('test', 1.0, 20140820)

private void btnTestTableInsert_Click(object sender, EventArgs e)
{
    int rowsAffected = 0;
    String bigInsert = "";

    bigInsert += "INSERT INTO iminvtrx_sql_i(item_no, totalTransactions, compileDate) ";

    for (int i = 0; i < 2100; i++)
    {
        rowsAffected += addToDatabase(i);
    }

    MessageBox.Show("There were " + rowsAffected.ToString() + " added to the table!");
}

private int addToDatabase(int count)
{
    int rowsAffected = 0;
    string insertString = "";

    using (SqlConnection connection = finder.getConnectionFor("data_01"))
    {
        SqlCommand command = connection.CreateCommand();

        insertString = "BEGIN TRANSACTION INSERT INTO iminvtrx_sql_i(item_no, totalTransactions, compileDate) VALUES('test', 1.0, @increment) COMMIT TRANSACTION";
        command.CommandText = insertString;
        command.Parameters.AddWithValue("@increment", count);

        try
        {
            connection.Open();
            rowsAffected = command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, ex.InnerException.ToString());
        }
    }

    return rowsAffected;
}

A:

The behavior you mention is expected.  The row count stored in system tables is not guaranteed to be 100% accurate and can be corrected with DBCC UPDATEUSAGE (which sp_spaceused optionally invokes when the updateusage option is specified).  The only way to get a transactionally consistent rowcount in any version of SQL Server is with SELECT COUNT.
The rowcount stored in the DMVs in SQL 2005 and later versions tends to be more accurate.

