Well yes. That because you ask for the same image every time you go round the loop:
SqlCommand cmmd = new SqlCommand("select image from item where cat_id=5", con);
If you replace the "5" with the value from your loop, then it will return different images.
But ... you have already retrieved all the images and they are in your DataTable - so why not use the values directly from there?
byte[] bytes = (byte[]) dt.Rows[i]["image"];
And I'd use a
foreach
on the Rows instead of a
for
loop.