views:

544

answers:

2

Hi guys.

I have this little question, thats been on my head for while now.

Here it goes:

Is it possible to temporary disable the Auto_Increment on the collum ID.

So that i can add a new row to the table and being able specify the ID value when inserting the row.

And then in the end enable the Auto_Increment again, and let do its work as usual?

And if its possible how can i do it.

The Table structure is very simple

Collum Name (atributes)

ID (Primary Key, Auto Increment, int, not null)

Name (nvarchar(100), not null)

Notice:

  • The table name is: People.

  • Lets also consider that the table already has data and cannot be changed.

  • The database server is SQL Server CE.

  • The SQL commands will be executed in a C# program, if its of any help.

I really hope its possible, it would come very handy.

Thanks

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());
        }

The Connection string is working, i have tried it.

He reports:

There was an error parsing the query. [ Token line number = 1,Token line offset = 20,Token in error = SET ]

SOLUTION thanks to 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());
        }
+2  A: 

I believe you can use SET IDENTITY_INSERT. I am not sure if this works in all versions.

Update 2:

Try this version:

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());
}
RedFilter
I've tried "SET IDENTITY_INSERT People ON" and then i tried to insert some rows specifying the ID, and the program crashes. And VB is only able to say this: "The column cannot be modified. [Column name = id]"
Fábio Antunes
The same happens if i try add a row and specifying the ID and not running "SET IDENTITY_INSERT". For what i can see i think "SET IDENTITY_INSERT" doesn't as any affect.
Fábio Antunes
Are you executing it as one semi-colon separated batch statement?
RedFilter
Separated statement.. According to Sql Server Docs, set indentity_insert works with SQL Server CE 3.5 e newer. Mine is 3.5, do i don't see whats the problem.
Fábio Antunes
@Fabio: Show us your VB code.
RedFilter
Its in my new edit. PS: Its C# code, i made a mistake before and typed VB in my comment, sorry.
Fábio Antunes
@Fabio: you are doing it as two queries, you need to do it in one, e.g., `string query = "SET IDENTITY_INSERT People ON;INSERT INTO People SET (ID, Nome) VALUES (@ID, @Nome)";`
RedFilter
@Fabio: see my update
RedFilter
Still not working. "There was an error parsing the query. [ Token line number = 1,Token line offset= 31,Token in error = INSERT ]"
Fábio Antunes
Hmm, ok, try re-using the same command object in your code. I'll post an updated example.
RedFilter
No luck :( "There was an error parsing the query. [ Token line number = 1,Token line offset= 20,Token in error = SET ]" I really don't have idea wants wrong :S Many examples on the web do the same as you told me.
Fábio Antunes
@Fabio: No that's good! It is complaining about your `INSERT` query syntax now. Remove the word `SET`, it should not be there for an `INSERT`, that is for `UPDATE` queries. I updated my code.
RedFilter
Bingo. This will save me a lot of trouble in future cases when restoring the database from a xml file. My greatest thanks.
Fábio Antunes
Glad to hear it.
RedFilter
+1  A: 

Already answered here...

kzen
I already had tried that, with no success.
Fábio Antunes