<p>We have a major VB6 trading application which uses MS Access (Don't ask!) It is always blasting trades into an MS Access database.</p>

<p>The rest of the infrastructure here has moved on considerably and I want to read this Access database periodically and copy any new trades into a SQL server database.</p>

<p>The SQL and C# needed to do this is trivially easy.</p>

<p>BUT I want to make sure I do it in such a way that does not lock the Access database or cause problems for the VB6 app. In other words when populating my DataTable from Access I do NOT want to lock the database and prevent the VB6 app writing to it. I seem to remember from old ADO there were share modes you could use for this purpose.</p>

<p>What sort of connection string should I use from .NET to accomplish this?</p>

Just an idea ... but have you thought about upgrading the database so that the tables themselves are actually stored in SQL Server and Access just become the front end?  It's been a little while, but if I remember correctly, Access should have a wizard (yuck!) to help you do this.
With old ADO you could set the cursor or lock type mechanism to one of the following:
Cursor Type
adOpenForwardOnly
This type of cursor can only be used to move forward through the recordset. This option is used when a list box or combo box is to be  populated.
adOpenKeyset
This is the best type of cursor to use when we expect a large recordset because we are not informed when changes are made to data that can affect our recordset.
adOpenDynamic
This cursor allows us to see all the changes made by other users that affect our recordset. It is the most powerful type of cursor but the slowest one.
adOpenStatic
The static cursor is useful when we have a small recordset.
Lock Type
adLockReadonly
This lock mode is used when no additions, updates or deletions are allowed from recordset
adLockPesimistic
In pessimistic locking, the record is locked as soon as editing begins and remains  locked until editing is completed.
adLockOptimistic
This occurs when the update method is called on the record. the record is unlocked even while edit but is temporarily locked when the changes are saved to the database
adLockBatchOptimistic
This option allows us to perform optimistic locking when we are updating a batch of records
Not sure how that exactly translates into the .NET world ... but maybe this can get you pointed in the right direction.