You are doing cmd.Parameters.AddWithValue
in the loop.
This means a parameter is added at each iteration. I do not know about DB4, but I would bet that the OleDB drivers is trying to handle extra additional unused parameters the best it can. It succeeds, but the operation take much more time.
Please insert cmd.Parameters.Clear()
like this, and tell if things are running better.
foreach (DataRow row in fstathotel.Rows)
{
cmd.CommandText = @"insert into fstathote values (" + Convert.ToInt32(row["mpe"]) + ",'" + Convert.ToDateTime(row["date"]) + "','" + row["type"].ToString() + "',?,'" + Convert.ToDateTime(row["edate"]) + "')";
cmd.Parameters.Clear(); // Clear the parameter list
cmd.Parameters.AddWithValue("parmSlot1", Decimal.Parse(row["value"].ToString()));
cmd.ExecuteNonQuery();
}
Additionally, I would also try to enclose the loop in a database transaction. Remember that too much indexes on the table are bad for insertion performances.