"Index out of range" means just that: you are trying to access an array element by using an index value that is larger than the maximum index value.
If you declare an array of of integers:
int[] ints = new int[3];
Then you can access it happily using the index:
int a = ints[0];
int b = ints[1];
int c = ints[2];
But if you try to use a negative number, or a value greater than two you will get the error "Index out of range" because there is no element at that index value.
Your code uses "magic numbers" - which is generally a bad idea - and it's almost certainly this line that causes the problem:
city = Convert.ToString(dr[2]),
Since the addition info says it's "column 2" it can't find.
I'd start by using the debugger to find out what is in the DataReader: put a breakpoint on the line
Proj addTable = new Proj ()
And run your app in the debugger.
When it hits that line, it will stop, and let you look at exactly what is in the variables.
Look to your data: it's probably something to do with the problem - and you need the actual data it read to identify exactly what is going on.
Sorry, but we can't do any of that for you: we don't have your data files, so we can't duplicate your problem here!