2010-04-21 14 views
6

Mam to małe pytanie, które już od jakiegoś czasu mi chodziło.Sql Server CE - Tymczasowe wyłączanie automatycznego przyrostu dla konkretnej kolumny

Tu idzie:

Czy możliwe jest tymczasowe wyłączenie AUTO_INCREMENT na ID kolumny.

Dzięki temu mogę dodać nowy wiersz do tabeli i móc określić wartość identyfikatora podczas wstawiania wiersza.

A następnie na koniec ponownie włączyć funkcję Auto_Incment i pozwolić jej działać jak zwykle?

A jeśli to możliwe, jak mogę to zrobić?

Struktura tabeli jest bardzo prosta

Nazwa kolumny (atrybuty)

ID (Primary Key, Auto Increment, int, not null) 
Name (nvarchar(100), not null) 

Uwaga:

  • Nazwa tabeli jest: People.
  • Rozważmy również, że tabela ma już dane i nie można jej zmienić.
  • Serwer bazy danych to SQL Server CE.
  • Polecenia SQL zostaną wykonane w programie C#, jeśli będzie potrzebna.

Naprawdę mam nadzieję, że to możliwe, przyda się bardzo.

Dzięki

EDIT

SqlActions SqlActions = new SqlActions(); 

SqlCeCommand SqlCmd = new SqlCeCommand("SET IDENTITY_INSERT People ON", SqlActions.Connection()); 

try 
{ 
    SqlCmd.ExecuteNonQuery(); 
} 
catch (SqlCeException Error) 
{ 
    Console.WriteLine(Error.ToString()); 
} 

string query = "INSERT INTO People SET (ID, Nome) VALUES (@ID, @Nome)"; 

SqlCeCommand SqlInsert = new SqlCeCommand(query, SqlActions.Connection()); 

SqlInsert.Parameters.AddWithValue("@ID", 15); 
SqlInsert.Parameters.AddWithValue("@Nome", "Maria"); 

try 
{ 
    SqlInsert.ExecuteNonQuery(); 
} 
catch (SqlCeException Error) 
{ 
    Console.WriteLine(Error.ToString()); 
} 

Ciąg połączenie działa, próbowałem go.

On donosi:

Wystąpił błąd parsowania zapytania. [Reklamowe numer linii = 1, Reklamowe linia przesunięcie = 20, token w Error = SET]

SOLUTIONdzięki OrbMan

 SqlActions SqlActions = new SqlActions(); 

     SqlCeCommand SqlCmd = new SqlCeCommand("SET IDENTITY_INSERT People ON", SqlActions.Connection()); 
     try 
     { 
      SqlCmd.ExecuteNonQuery(); 

      string query = "INSERT INTO People (ID, Nome) VALUES (@ID, @Nome)"; 
      SqlCmd.CommandText = query; 
      SqlCmd.Parameters.AddWithValue("@ID", 15); 
      SqlCmd.Parameters.AddWithValue("@Nome", "Vania"); 
      SqlCmd.ExecuteNonQuery(); 
     } 
     catch (SqlCeException Error) 
     { 
      Console.WriteLine(Error.ToString()); 
     } 
+0

już odpowiedział [tutaj] (http://stackoverflow.com/questions/682654/sql-server-ce-3-5 -identity-insert) ... –

+0

Już próbowałem tego, bez powodzenia. –

Odpowiedz

8

wierzę można użyć SET IDENTITY_INSERT. Nie jestem pewien, czy to działa we wszystkich wersjach.

Aktualizacja 2:

Spróbuj tej wersji:

SqlActions SqlActions = new SqlActions(); 
SqlCeCommand SqlCmd = new SqlCeCommand("SET IDENTITY_INSERT People ON", SqlActions.Connection()); 
try 
{ 
    SqlCmd.ExecuteNonQuery(); 
    string query = "INSERT INTO People (ID, Nome) VALUES (@ID, @Nome)"; 
    SqlCmd.CommandText = query; 
    SqlCmd.Parameters.AddWithValue("@ID", 15); 
    SqlCmd.Parameters.AddWithValue("@Nome", "Maria"); 
    SqlCmd.ExecuteNonQuery(); 
} 
catch (SqlCeException Error) 
{ 
    Console.WriteLine(Error.ToString()); 
} 
+0

Próbowałem "SET IDENTITY_INSERT People ON", a następnie próbowałem wstawić kilka wierszy określających identyfikator, a program ulega awarii. A VB może tylko powiedzieć: "Kolumny nie można modyfikować. [Nazwa kolumny = id]" –

+0

To samo stanie się, gdy spróbuję dodać wiersz i podać ID, a nie uruchomić "SET IDENTITY_INSERT". Z tego co widzę, myślę, że "SET IDENTITY_INSERT" nie ma żadnego wpływu. –

+1

Czy robisz to jako jedno polecenie wsadowe rozdzielone średnikiem? – RedFilter

Powiązane problemy