У меня есть приложение, которое (в настоящее время) должно использовать БД, обслуживаемые как SQL Server 2000, так и SQL Server 2005.
Я пытаюсь программно переместить БД с одного сервера на другой. Все таблицы, которые я использую, имеют автоинкрементный первичный ключ. Поскольку эти автоматически увеличивающиеся ключи используются в качестве внешних ключей в других таблицах, мой план атаки для копирования таблиц состоял в том, чтобы временно отключить автоинкремент в целевой таблице, ВСТАВИТЬ записи дословно (с исходными первичными ключами), а затем включить автоматический -инкремент обратно на.
Если я правильно понимаю, я могу "включать / выключать автоинкремент" по одной таблице за раз, выполнив
SET IDENTITY_INSERT tbl_Test ON;
...
SET IDENTITY_INSERT tbl_Test OFF;
Моя реализация находится в VB 2005 с использованием System.Data.SqlClient.
Для краткости я покажу только строки кода, относящиеся к построению SQL-запросов.
Чтобы создать таблицу:
Dim createTableStatement As String = _
"CREATE TABLE tbl_Test (" & _
"ID_Test INTEGER PRIMARY KEY IDENTITY," & _
"TestData INTEGER" & _
")"
Dim createTableCommand As New SqlCommand(createTableStatement, connection)
createTableCommand.ExecuteNonQuery()
Чтобы включить или выключить IDENTITY_INSERT:
Dim turnOffIdentInsertStatement As String = _
"SET IDENTITY_INSERT tbl_Test OFF;"
Dim turnOffIdentInsertCommand As New SqlCommand(turnOffIdentInsert, connection)
turnOffIdentInsertCommand.ExecuteNonQuery()
Dim turnOnIdentInsertStatement As String = _
"SET IDENTITY_INSERT tbl_Test ON;"
Dim turnOnIdentInsertCommand As New SqlCommand(turnOnIdentInsert, connection)
turnOnIdentInsertCommand.ExecuteNonQuery()
Чтобы вставить новую запись в обычном режиме без указания первичного ключа:
Dim insertRegularStatement As String = _
"INSERT INTO tbl_Test (TestData) VALUES (42);"
Dim insertRegularCommand As New SqlCommand(insertRegularStatement, connection)
insertRegularCommand.ExecuteNonQuery()
Чтобы вставить новую запись с явным первичным ключом:
Dim insertWithIDStatement As String = _
"INSERT INTO tbl_Test (ID_Test, TestData) VALUES (20, 42);"
Dim insertWithIDCommand As New SqlCommand(insertWithIDStatement, connection)
insertWithIDCommand.ExecuteNonQuery()
Итак, мой план состоит в том, чтобы вызвать код, который включает IDENTITY_ INSERT, добавить записи с явными первичными ключами, а затем выключить IDENTITY_ INSERT.
Этот метод работает нормально, когда я разговариваю с SQL Server 2000, но я сталкиваюсь с исключением, когда пробую тот же код для SQL Server 2005:
"Cannot insert explicit value for identity column in table 'tbl_Test' when IDENTITY_INSERT is set to OFF."
Какие-нибудь намеки? Заранее спасибо, как всегда.