Avatar billede paahlman Nybegynder
31. december 2005 - 13:13 Der er 26 kommentarer og
1 løsning

Rows affected vs. newID

Hej eksperter.

Jeg har brug for at få det nye PartID tilbage når jeg indsætter i databasen. Jeg får imidlertid altid returneret '1', hvilket minder mere om rows affected. min sql ser således ud:

"INSERT INTO tblPart (PartNumber, k_PartspecID, k_ComponentID, k_valueID, k_TypeID, " +
"k_RatingID, k_GradeID, k_Pkg_TypeID, k_MountID, k_CategoryID, k_UserID, k_ProjectID, " +
"k_PartstatusID, k_SymbolID, Date)" +
"VALUES (@PartNumber, @k_PartspecID, @k_ComponentID, @k_valueID, @k_TypeID, @k_RatingID, @k_GradeID, @k_Pkg_TypeID, @k_MountID, @k_CategoryID, @k_UserID, @k_ProjectID, @k_PartstatusID, @k_SymbolID, @Date)" +
"SELECT @@IDENTITY AS 'PartID'"

er det mig der har misforstået noget? i følge dette link skulle det da være ok ?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_globals_50u1.asp

eller hvad?

vh
Avatar billede arne_v Ekspert
31. december 2005 - 13:16 #1
hvad gør du helt præcist ?

ovenstående antyder at du forsøger at execute 2 SQL sætninger i 1 kald
Avatar billede paahlman Nybegynder
31. december 2005 - 13:21 #2
fair nok. Helt præcist ser hele koden såleds ud:

public int CreatePartAttributes(string partNo, int partSpec, int component, int value1,
            int type, int rating, int grade, int pkg, int package, int mount,
            int category, int user, int project, int status, int symbol)
        {
            string SQLTING = "INSERT INTO tblPart (PartNumber, k_PartspecID, k_ComponentID, k_valueID, k_TypeID, " +
                "k_RatingID, k_GradeID, k_Pkg_TypeID, k_MountID, k_CategoryID, k_UserID, k_ProjectID, " +
                "k_PartstatusID, k_SymbolID, Date)" +
                "VALUES (@PartNumber, @k_PartspecID, @k_ComponentID, @k_valueID, @k_TypeID, @k_RatingID, @k_GradeID, @k_Pkg_TypeID, @k_MountID, @k_CategoryID, @k_UserID, @k_ProjectID, @k_PartstatusID, @k_SymbolID, @Date)" +
                "SELECT @@IDENTITY AS 'PartID'";
            //@@IDENTITY selects the id of the new row, see link or doc.
            //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_globals_50u1.asp
                       
            using (SqlCommand command = new SqlCommand(SQLTING, this.connection))
            {
                command.Parameters.Add("@PartNumber", partNo);
                command.Parameters.Add("@k_PartspecID", partSpec );
                command.Parameters.Add("@k_ComponentID", component);
                command.Parameters.Add("@k_valueID", value1);
                command.Parameters.Add("@k_TypeID", type);
                command.Parameters.Add("@k_RatingID", rating);
                command.Parameters.Add("@k_GradeID", grade);
                command.Parameters.Add("@k_Pkg_TypeID", pkg);
                command.Parameters.Add("@k_PackageID", package);
                command.Parameters.Add("@k_MountID", mount);
                command.Parameters.Add("@k_CategoryID", category);
                command.Parameters.Add("@k_UserID", user);
                command.Parameters.Add("@k_ProjectID", project);
                command.Parameters.Add("@k_PartstatusID", status);
                command.Parameters.Add("@k_SymbolID", symbol);
                command.Parameters.Add("@Date", DateTime.Now);

                try
                {
                    this.connection.Open();
                    //command.ExecuteNonQuery();
                    return Convert.ToInt32(command.ExecuteNonQuery());
                    //return 2;
                }
                finally
                {
                    this.connection.Close();
                }
            }
        }
Avatar billede arne_v Ekspert
31. december 2005 - 13:24 #3
det bør virke hvis du

laver en SqlCommand med INSERT
kalder ExecuteNonQuery på den

laver en anden SqlCommand med SELECT
kalder ExecuteScalar på den
Avatar billede paahlman Nybegynder
31. december 2005 - 13:32 #4
jamen så bør det jo virke allerede? Fejlen ligger nok et andet sted, har bare ikke rigtig nogle ideer :-(

vh
Avatar billede paahlman Nybegynder
31. december 2005 - 13:35 #5
eller nej, det gør det jo ikke hvis du mener jeg skal lave begge dele...
Avatar billede arne_v Ekspert
31. december 2005 - 13:49 #6
jeg mener at du skal lave begge dele
Avatar billede paahlman Nybegynder
31. december 2005 - 13:55 #7
Jeg synes bare ikke det fremgår af det link der er kommenteret ud?
Avatar billede arne_v Ekspert
31. december 2005 - 13:58 #8
det har du ret i
Avatar billede paahlman Nybegynder
31. december 2005 - 14:04 #9
det er jo både godt og skidt :-)

godt nytår
Avatar billede arne_v Ekspert
31. december 2005 - 14:07 #10
har du fået det til at virke med 2 commands ?
Avatar billede paahlman Nybegynder
31. december 2005 - 14:10 #11
ikke endnu, er ikke helt med på hvordan jeg skal implementere det så jeg prøver mig lidt frem.
Avatar billede arne_v Ekspert
31. december 2005 - 14:16 #12
SqlCommand ins = new SqlCommand("INSERT ...", conn);
ins.ExecuteNonQuery();
SqlCommand sel = new SqlCommand("SELECT @@IDENTITY", conn);
int id = (int)sel.ExecuteScalar();
Avatar billede arne_v Ekspert
31. december 2005 - 14:16 #13
Hvis du bruger triggers så overvej SCOPE_IDENTiTY() fremfor @@IDENTITY
Avatar billede paahlman Nybegynder
31. december 2005 - 14:34 #14
Jeg kan ikke rigtigt få det til at køre. jeg går ud fra at det skal være i to seperate using-blokke. og jeg bruger ikke triggers...
Avatar billede arne_v Ekspert
31. december 2005 - 14:36 #15
jeg ville nok bare lave det uden using ...
Avatar billede paahlman Nybegynder
31. december 2005 - 14:43 #16
uden using! UHA, så bliver min chef sur. Jeg prøver :-)
Avatar billede arne_v Ekspert
31. december 2005 - 14:48 #17
du kan også godt bruge 2 x using, men da SqlCommand mig bekendt ikke
holder nogle ressourcer så er det ikke specielt nødvendigt
Avatar billede paahlman Nybegynder
02. januar 2006 - 10:11 #18
hmm, jeg får det ikke til at køre...
Avatar billede arne_v Ekspert
02. januar 2006 - 11:07 #19
hvordan ser din kode ud nu ?
Avatar billede paahlman Nybegynder
02. januar 2006 - 12:18 #20
Nu ser den således ud:

public int CreatePartAttributes(string partNo, int partSpec, int component, int value1,
            int type, int rating, int grade, int pkg, int package, int mount,
            int category, int user, int project, int status, int symbol)
        {
            string SqlInsert = "INSERT INTO tblPart (PartNumber, k_PartspecID, k_ComponentID, k_valueID, k_TypeID, " +
                "k_RatingID, k_GradeID, k_Pkg_TypeID, k_MountID, k_CategoryID, k_UserID, k_ProjectID, " +
                "k_PartstatusID, k_SymbolID, Date)" +
                "VALUES (@PartNumber, @k_PartspecID, @k_ComponentID, @k_valueID, @k_TypeID, @k_RatingID, @k_GradeID, @k_Pkg_TypeID, @k_MountID, @k_CategoryID, @k_UserID, @k_ProjectID, @k_PartstatusID, @k_SymbolID, @Date)", // +
          string SqlSelect = "SELECT @@IDENTITY AS 'PartID'";
            //@@IDENTITY selects the id of the new row, see link for doc.
            //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_globals_50u1.asp
                       
        SqlCommand commandInsert = new SqlCommand(SqlInsert, this.connection)
        SqlCommand commandSelect = new SqlCommand(SqSelect, this.connection)
           
                commandInsert.Parameters.Add("@PartNumber", partNo);
                commandInsert.Parameters.Add("@k_PartspecID", partSpec);
                commandInsert.Parameters.Add("@k_ComponentID", component);
                commandInsert.Parameters.Add("@k_valueID", value1);
                commandInsert.Parameters.Add("@k_TypeID", type);
                commandInsert.Parameters.Add("@k_RatingID", rating);
                commandInsert.Parameters.Add("@k_GradeID", grade);
                commandInsert.Parameters.Add("@k_Pkg_TypeID", pkg);
                commandInsert.Parameters.Add("@k_PackageID", package);
                commandInsert.Parameters.Add("@k_MountID", mount);
                commandInsert.Parameters.Add("@k_CategoryID", category);
                commandInsert.Parameters.Add("@k_UserID", user);
                commandInsert.Parameters.Add("@k_ProjectID", project);
                commandInsert.Parameters.Add("@k_PartstatusID", status);
                commandInsert.Parameters.Add("@k_SymbolID", symbol);
                commandInsert.Parameters.Add("@Date", DateTime.Now);
       
        try
                {
                    this.connection.Open();
                    commandInsert.ExecuteNonQuery();
                    return (int)commandSelect.ExecuteScalar(); //fejler her
                 
                }
                finally
        {
            this.connection.Close();
        }
    }

med fejlbeskrivelsen: invalid cast.
Avatar billede paahlman Nybegynder
02. januar 2006 - 12:19 #21
rettelse til linje.
det her: @k_SymbolID, @Date)", // +

er faktisk: @k_SymbolID, @Date)"; // +
Avatar billede arne_v Ekspert
02. januar 2006 - 12:41 #22
skal

string SqlSelect = "SELECT @@IDENTITY AS 'PartID'";

ikke være

string SqlSelect = "SELECT @@IDENTITY AS PartID";

?
Avatar billede arne_v Ekspert
02. januar 2006 - 12:41 #23
ellers prøv lige

return (int)(long)commandSelect.ExecuteScalar();

return (int)(decimal)commandSelect.ExecuteScalar();

da den måske ikke returnerer en 32 bit int
Avatar billede paahlman Nybegynder
02. januar 2006 - 13:03 #24
ifølge microsoft skal det være 'PartID' men det virker osse uden gnyffer.

Jeg bruger return Convert.ToInt32(commandInsert.ExecuteNonQuery()); da jeg mener den returnerer en 32 bit int. men return (int)(long)commandSelect.ExecuteScalar(); virker osse.

men uanset hvad jeg gør returnerer den stadig '1'. Jeg har tjekket at der bliver skrevet i databasen - det går fint. Når jeg læser om SELECT @@IDENTITY kan jeg se at den returnerer værdien på den indsatte række ellers NULL. Når nu PartID > 11000 i databasen kan jeg stadig fatte hvorfor den returnerer '1'....
Avatar billede paahlman Nybegynder
02. januar 2006 - 13:13 #25
jeg har en anden metode hvor det går godt:

public int InsertSymbol(string element)
        {
            string sql = "INSERT INTO tblSymbol VALUES (@element) SELECT @@IDENTITY AS 'SymbolID'";

            using (SqlCommand command = new SqlCommand(sql, this.connection))
            {
                command.Parameters.Add("@element", element);
               
                try
                {
                    this.connection.Open();
                    return Convert.ToInt32(command.ExecuteScalar());
                }
                finally
                {
                    this.connection.Close();
                }
            }
        }

så måden at gøre det på må være god nok...
Avatar billede paahlman Nybegynder
02. januar 2006 - 13:17 #26
hehe, got it. Det skal være gøres med en ExeCutaScalar().

men tak for hjælpen.

vh
Avatar billede paahlman Nybegynder
02. januar 2006 - 14:41 #27
lukker
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
Computerworld tilbyder specialiserede kurser i database-management

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