Avatar billede suppenudel Nybegynder
09. juni 2006 - 14:47 Der er 15 kommentarer og
2 løsninger

@@IDENTITY problem

Hej.

Jeg sidder med et ordrescript der skal skrive en ordre ind i min database.
Problemet er @@IDENTITY som jeg trækker i min InsertOrder, som jeg ikke kan få smidt ind i InsertItem metodens "ordernum". Som jeg gør det nu skulle oNum gerne være lig med @@IDENTITY og så skrives ind i ”ordernum” kolonnen, men jeg får fejlen:

"INSERT INTO-sætningen indeholder det ukendte feltnavn "ordernum". Kontroller, at du har skrevet navnet korrekt, og forsøg derefter at udføre handlingen igen."

       
Min kode:

Public Shared Function WriteOrder( _
ByVal o As Order) As Boolean
        Dim cs As String

        cs = WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
        con = New OleDbConnection(cs)

        con.Open()
        tran = con.BeginTransaction()
        Try
            InsertCustomer(o.Cust)
     
            Dim oNum As Integer

            oNum = InsertOrder(o)
            For Each item As CartItem _
            In o.Cart.GetItems()
                InsertItem(item, oNum)
            Next
            tran.Commit()
            con.Close()
            Return True
        Catch ex As Exception           
            Return False
        End Try
    End Function

Private Shared Function InsertOrder( _
ByVal o As Order) As Integer
        Dim command As New OleDbCommand()
        command.Connection = con
        command.Transaction = tran
        command.CommandText = "INSERT INTO Orders " _
        + "(orderdate, custemail, " _
        + "subtotal, salestax, " _
        + "shipping) " _
        + "VALUES (@OrderDate, @Custemail, " _
        + "@subtotal, @salestax, " _
        + "@shipping)"
        command.Parameters.AddWithValue( _
        "@OrderDate", DateTime.Now)
        command.Parameters.AddWithValue( _
        "@Custemail", o.Cust.Email)
        command.Parameters.AddWithValue( _
        "@subtotal", o.SubTotal)
        command.Parameters.AddWithValue( _
        "@salestax", o.SalesTax)
        command.Parameters.AddWithValue( _
        "@shipping", o.Shipping)
        command.ExecuteNonQuery()
        command.CommandText = "SELECT @@IDENTITY"
        Return Convert.ToInt32(command.ExecuteScalar())
    End Function

Private Shared Sub InsertItem( _
ByVal item As CartItem, _
ByVal oNum As Integer)

        Using connection As New OleDbConnection(WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)

            Try
                Dim command As New OleDbCommand("INSERT INTO OrderItems " _
                + "(ordernum, productid, " _
                + "name, price, quantity) " _
                + "VALUES (@OrderNum, @ProductID, " _
                + "@Name, @Price, @Quantity)", connection)
                command.Parameters.AddWithValue( _
                "@OrderNum", oNum)
                command.Parameters.AddWithValue( _
                "@ProductID", item.ID)
                command.Parameters.AddWithValue( _
                "@Name", item.Name)
                command.Parameters.AddWithValue( _
                "@Price", item.Price)
                command.Parameters.AddWithValue( _
                "@Quantity", item.Quantity)

                command.Connection = con
                command.Transaction = tran

                Dim reader As OleDbDataReader = command.ExecuteReader()
                While reader.Read()
                    command.ExecuteNonQuery()
                End While
                reader.Close()
               
            Catch ex As Exception
                HttpContext.Current.Response.Write(ex.ToString)               
            End Try           
        End Using
Avatar billede arne_v Ekspert
09. juni 2006 - 15:13 #1
proev og brug 2 forskellige OleDbCommand for INSERT og SELECT @@IDENTITY
Avatar billede a1a1 Novice
09. juni 2006 - 15:16 #2
eller command.ExecuteScalar, giver et resultat

f.eks.:
newID = command.ExecuteScalar()

;o)
Avatar billede -mundi- Nybegynder
09. juni 2006 - 15:18 #3
tilføj et output parameter til dit commandobject og tildel det værdien af @@identity istedet, det virkede ihvertfald for mig :-)
Avatar billede suppenudel Nybegynder
09. juni 2006 - 15:24 #4
Så ser min InsertOrder således ud:

    Private Shared Function InsertOrder( _
ByVal o As Order) As Integer

        Dim command As New OleDbCommand()
        command.Connection = con
        command.Transaction = tran
        command.CommandText = "INSERT INTO Orders " _
        + "(orderdate, custemail, " _
        + "subtotal, salestax, " _
        + "shipping) " _
        + "VALUES (@OrderDate, @Custemail, " _
        + "@subtotal, @salestax, " _
        + "@shipping)"
        command.Parameters.AddWithValue( _
        "@OrderDate", DateTime.Now)
        command.Parameters.AddWithValue( _
        "@Custemail", o.Cust.Email)
        command.Parameters.AddWithValue( _
        "@subtotal", o.SubTotal)
        command.Parameters.AddWithValue( _
        "@salestax", o.SalesTax)
        command.Parameters.AddWithValue( _
"@shipping", o.Shipping)
        command.ExecuteNonQuery()

        Dim idcommand As New OleDbCommand()
        idcommand.Connection = con
        idcommand.Transaction = tran

        idcommand.CommandText = "SELECT @@IDENTITY"
        Return Convert.ToInt32(idcommand.ExecuteScalar())

    End Function

Jeg får dog stadig fejlen:

System.Data.OleDb.OleDbException: INSERT INTO-sætningen indeholder det ukendte feltnavn "ordernum". Kontroller, at du har skrevet navnet korrekt, og forsøg derefter at udføre handlingen igen. at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.OleDb.OleDbCommand.ExecuteReader() at OrderDB.InsertItem(CartItem item, Int32 oNum)
Avatar billede suppenudel Nybegynder
09. juni 2006 - 15:25 #5
- med forskellige OleDbCommand for INSERT og SELECT @@IDENTITY
Avatar billede suppenudel Nybegynder
09. juni 2006 - 15:28 #6
-Mundi -> hvordan gør jeg det helt specifikt? :-)
Avatar billede -mundi- Nybegynder
09. juni 2006 - 15:32 #7
Er der en "ordernum" kolonne i OrderItems tabellen ? Det antyder fejlmeddelelsen jo at der ikke er
Avatar billede arne_v Ekspert
09. juni 2006 - 15:32 #8
du har set at fejlen sker i

OrderDB.InsertItem

?
Avatar billede suppenudel Nybegynder
09. juni 2006 - 17:35 #9
-mundi- ja, ordernum er fremmednøgle i min OrderItems-tabel og primær i min Orders-tabel.
I min Orders-tabel er den "autonummerering", og i OrderItems er den af datatypen "tal".

arne_v - jo, fejlen bliver smidt som en exception når den afvikler InsertItem. Kan jeg placere nogle breakpoints bestemte steder for at hjælpe på det?
Avatar billede suppenudel Nybegynder
09. juni 2006 - 17:37 #10
Når jeg kører det fyldes de rigtige data ind i Orders, men intet i OrderItems, hvor fejlen også forekommer.
Avatar billede suppenudel Nybegynder
09. juni 2006 - 18:06 #11
Og hvis jeg laver en response.write(oNum) i starten af min InsertItem metode, udskriver den ganske rigtigt et højeste ordernum fra min "Orders"-tabel, så den del virker - Men underligt nok ser det ud som om den ikke tror der findes en  "ordernum" kolonne i OrderItems, som -mundi- er inde på ...
Avatar billede suppenudel Nybegynder
09. juni 2006 - 18:19 #12
Hmm.. nu har jeg oprettet databasen fra ny, og det ser ud til at virke. En slå-fejl et eller andet sted?
Avatar billede suppenudel Nybegynder
09. juni 2006 - 19:01 #13
Det virker, bortset fra at hver ordre indskrives to gange i både OrderItems og Orders. De har fortløbende "ordernum", eksempelvis 1 i første post og 2 i næste.
Avatar billede suppenudel Nybegynder
11. juni 2006 - 11:31 #14
Jeg har fået det til at virke.. Takker for hjælpen, læg et svar I andre :-)
Avatar billede arne_v Ekspert
12. juni 2006 - 03:11 #15
ok
Avatar billede -mundi- Nybegynder
13. juni 2006 - 21:04 #16
springer point over denne gang :-)
Avatar billede suppenudel Nybegynder
16. juni 2006 - 09:24 #17
Bare i orden, tak for det :-)
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