Start by never using
SELECT * FROM
as an SQL query - particularly when you need a specific order to your values. Always list the column names, or the rows returned may not be in the order you expect, and then you get type conflicts.
Try:
INSERT INTO Cancelled_Meeting (meeting_id, date, room_id, attendees_pax, start_time, end_time)
SELECT meeting_id, date, room_id, attendees_pax, start_time, end_time from meeting
WHERE ...
But ... I worry about that "{0}" at the end - it implies you are going to concatenate strings to form the final SQL statement in your ExecSQL method, and that's very dangerous - it leaves your code wide open to SQL Injection which can destroy your entire database. Use Parametrized 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?