problem solved, the second solution in the following link.
http://aspadvice.com/blogs/rjdudley/...5/13/2589.aspx
my code originally use adapter.fill(dataset);
when I change it to adapter.fill(dataset, "tablename");
I thought it is rediculus to add a tablename since the adapter has setted a select command on a specified table, but, it turns out the crystal report do need this rediculus confirmation.
Good luck to all of you who found this thread.