Ad ogni "dr.read()" il framework esegue una read, quindi dove c'e' la if ti consiglio di controllare se il DataReader contiene qualcosa, oppure di togliere la if, altrimenti al primo passaggio controllerai l'elemento 1 e non 0.
L'errore con molta probabilita' dipende dal Get su ".tipo", prova con .GetInt32().
codice:if (dr.HasRows) { while (dr.Read()) { vocaboli[i].italiano = dr.GetString(0); vocaboli[i].inglese = dr.GetString(1); vocaboli[i].tipo = dr.GetInt32(2); i +=1; } }