When you create an IDENTITY column, you are telling the database system to manage it for you: every time you INSERT a new row, it will automatically assign a new value to it for you, you don't have to do anything to fill in its value - in fact, you
can't give it a value yourself without the database complaining!
THe problem is that you don't specify which value is to go into which column, so SQL will assign them starting from the first column going on from there. Since the convention is to have ID values at the start, that means that you re trying to assign the content of textBox2 to the ID column, and you get an error.
Always specify column names: it makes your code more "future proof" and thus more reliable. The syntax is:
INSERT INTO MyTable (Column1Name, Column2Name) VALUES (ValueForColumn1, ValueForColumn2)
But ... don't do it like you are! Never concatenate strings to build a SQL command. It leaves you wide open to accidental or deliberate SQL Injection attack which can destroy your entire database. Always use Parameterized queries instead.
When you concatenate strings, you cause problems because SQL receives commands like:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
The quote the user added terminates the string as far as SQL is concerned and you get problems. But it could be worse. If I come along and type this instead: "x';DROP TABLE MyTable;--" Then SQL receives a very different command:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;
Which SQL sees as three separate commands:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
A perfectly valid SELECT
DROP TABLE MyTable;
A perfectly valid "delete the table" command
And everything else is a comment.
So it does: selects any matching rows, deletes the table from the DB, and ignores anything else.
So ALWAYS use parameterized queries! Or be prepared to restore your DB from backup frequently. You do take backups regularly, don't you?