This:
dt3.ToString();
will just give you the String-representation of the whole DataTable, something like "System.Data.DataTable". Not any of the values therein.
Since you're querying for a single value, it will be in row 0, column 0:
txtCatIdProducts.Text = dt3.Rows[0][0].ToString();
Whenever querying for single values you should use
ExecuteScalar[
^] which is meant for exactly that, instead of an SqlDataAdapter.