Avatar billede boomshanka Nybegynder
08. februar 2009 - 18:41 Der er 3 kommentarer og
1 løsning

Ændre identity value i databasen via C#

Jeg er lidt blank her. Jeg har en tabel i en SQL 2005 database som jeg kører unittest med NUnit på. Jeg vil gerne kunne rydde op i det data som er brug til unittesten. Blandt andet forsøger jeg at køre dette mod databasen i min teardown-metode:


string commandText = "DELETE FROM mytable WHERE mytable.mycolumn = 'myvalue';";
command.CommandText = commandText;
command.CommandType = CommandType.Text;
int rowsAffected = command.ExecuteNonQuery();
.
.
.
commandText = "DBCC CHECKIDENT ('mytable', RESEED, 0);";
command.ExecuteNonQuery();
commandText = "DBCC CHECKIDENT ('mytable', RESEED);";
command.ExecuteNonQuery();


Dette skulle gerne returnere identity i tabellen til udgangspunktet før unittesten, men det sker bare ikke...

Teardown-metoden kører med sin egen databasebruger, og brugeren er db_owner på databasen. Hvis jeg kører hver commandText direkte på databasen (logget ind med førnævnte bruger), så virker det fint, så jeg tror det må være et issue i .NET og ikke databasen. Ovenstående er taget fra http://msdn.microsoft.com/en-us/library/ms176057(SQL.90).aspx, men jeg kan bare ikke få det til at virke. Er der nogen som har en ide om hvorfor det ikke virker?
Avatar billede arne_v Ekspert
09. februar 2009 - 02:34 #1
Skal:

commandText = "DBCC CHECKIDENT ('mytable', RESEED, 0);";

være:

command.commandText = "DBCC CHECKIDENT ('mytable', RESEED, 0);";

?
Avatar billede arne_v Ekspert
09. februar 2009 - 02:35 #2
Umiddelbart virker det fint hos mig:

using System;
using System.Data;
using System.Data.SqlClient;

namespace E
{
    public class Reseed
    {
        public static void Main(string[] args)
        {
            SqlConnection con = new SqlConnection(@"Server=ARNEPC3\SQLEXPRESS;Database=Test;Integrated Security=SSPI");
            con.Open();
            SqlCommand cre = new SqlCommand("CREATE TABLE z(id INTEGER IDENTITY PRIMARY KEY, txt VARCHAR(50))", con);
            cre.ExecuteNonQuery();
            SqlCommand ins = new SqlCommand("INSERT INTO z(txt) VALUES('ABC')", con);
            ins.ExecuteNonQuery();
            ins.ExecuteNonQuery();
            SqlCommand del = new SqlCommand("DELETE FROM z", con);
            del.ExecuteNonQuery();
            SqlCommand reseed = new SqlCommand("DBCC CHECKIDENT ('z', RESEED, 0)", con);
            reseed.ExecuteNonQuery();
            ins.ExecuteNonQuery();
            ins.ExecuteNonQuery();
            SqlCommand sel = new SqlCommand("SELECT MAX(id) FROM z", con);
            Console.WriteLine(sel.ExecuteScalar());
            SqlCommand drp = new SqlCommand("DROP TABLE z", con);
            drp.ExecuteNonQuery();
            con.Close();
            Console.ReadKey();
        }
    }
}

udskriver pænt 2 som det skal.
Avatar billede boomshanka Nybegynder
14. februar 2009 - 23:07 #3
Nå, nu fik jeg set på det med friske øjne, rettede koden igennem og nu virker det selvfølgelig uden problemer. Jeg kender desværre ikke årsagen, men det kan muligvis ha' været en fejl i min sql forespørgsel som ikke blev fanget af koden og derfor aldrig nåede til mit reseed.

Jeg har ikke så stor interesse i point og dit svar fik mig alligevel til at gå koden igennem for at være sikker på det ikke var en skrivefejl. Hvis du smider et svar, så får du dine point :-)
Avatar billede arne_v Ekspert
15. februar 2009 - 00:55 #4
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester