Hello and welcome to Objo and thank you for such a well-prepared report. The debug screenshot before the insert was exactly what pinned this down. This is a genuine bug in Objo, not something wrong with your code. Sorry about that.
What's happening: for MySQL columns declared as an unsigned integer (smallint unsigned, int unsigned, and friends) or a plain tinyint, the MySQL driver hands Objo the value in a form our DatabaseColumn integer conversion doesn't currently recognise, so IntegerValue silently returns 0. String columns take a different path, which is why name and slug copy across correctly while every code ends up as 0.
You can carry on with your import right away by reading the column as text and parsing it:
stmt.Bind(1, Integer.Parse(rs.Column("brandCode").StringValue))
StringValue isn't affected, so this gives you the real value for every row.
The bug is logged and will be fixed in the next release: https://feedback.objo.dev/bug/1553
If you'd like to confirm the diagnosis on your side, SHOW CREATE TABLE on the MySQL table will most likely show brandCode as smallint unsigned but either way, the fix is on us.
Thanks again for the report, and don't hesitate to ask as you explore the rest of the IDE.