CREATE PROCEDURE SP_UpdateMyTable @id int = NULL, @field1 int = NULL, @field2 int = NULL AS SET NOCOUNT ON IF EXISTS (SELECT id FROM MyTable WHERE id = @id) UPDATE MyTable SET field1 = ISNULL(@field1, field1), field1 = ISNULL(@field2, field2) WHERE id = @id ELSE INSERT MyTable (id, field1, field2) SELECT @id, @field1, @field2) SELECT @activitykey = SCOPE_IDENTITY()I've not used DataReaders, but in this case, it would probably be faster than reading the VFP table into a DataSet. But either way (DataSet or DataReader), you would need to iterate through each row, set parameters and call the Stored Proc. I'll show you how to do it with a DataSet because that's what I'm more familiar with (but the same principle applies). Sorry that this code is in C#, but you can convert it to VB using one of the online converters.
SqlCommand sc = new SqlCommand("SP_UpdateMyTable", MySqlConnection); sc.CommandType = CommandType.StoredProcedure; MySqlConnection.Open() foreach(DataRow row in MyVFPData.Tables[0].Rows) { this.SetParameters(sc, MyVFPData.Tables[0], row); sc.ExecuteNonQuery(); } MySqlConnection.Close(); ... // This could be in the above for loop, but I broke it out for clarity // (plus, I would do it this way anyway, since this type of method is // typically in my DataAccess base class). public void SetParameters(SqlCommand sc, DataTable Table, DataRow Row) { sc.Parameters.Clear(); for (int i = 0; i < Table.Columns.Count; i++) { if (Row[i] != System.DBNull.Value) { sc.Parameters.Add("@" + Table.Columns[i].ColumnName, Row[i]); } } }~~Bonnie