hej alla smarta, @@identity visar alltid senasre insertat värde, alltså om du gör en insert mot en ny tabell, så ändrar du på @@identity. Hej Mikael, Hej igen, Någon som kan hjälpa mig? Hej, deklarera variabel Hej Mikael, Nej!@@identity ändrar värde när den ska lägga in flera poster i en tabell med senast
Jag kör Asp.net 1.1 / VB.net / MS Access / Webmatrix och behöver hjälp!!
Se kod:
Dim strSql3 as string = "SELECT * FROM tblNarvarande"
Dim Dr3 as OLEDBDatareader = datareader_data(strSql3)
'// For-loop som körs för alla rutor. Kollar för varje gång om någon ruta är vald, om den är det så ska ny post skrivas till tblNarvarande
Dim i as integer
Const NyttKvall_id as string = "@@identity"
For i=0 To BoxNarvarande.Items.Count - 1
If BoxNarvarande.Items(i).Selected Then
'Dim sql4 as string = "INSERT INTO tblNarvarande(kvall_id,medlem_id) VALUES(" & "@@identity" & "," & boxNarvarande.items(i).value & ")"
Dim sql4 as string = "INSERT INTO tblNarvarande(kvall_id,medlem_id) VALUES(" & NyttKvall_id & "," & boxNarvarande.items(i).value & ")"
'response.Write(sql4)
'// Command-objekt
Dim Cmd2 as new OLEDBCommand(sql4, Con)
'// Köra frågan mot databasen
Cmd2.executeNonQuery()
End If
Next
'// Stäng anslutningen
Con.close()
'// Förhindra låsning
Dr2.close()
Dr3.close()
Jag har problemet att jag inte får @@identity att fortsätta vara senast inlagda post från tblKvall medans posterna från checkboxlisten läggs in i tblNarvarande. När första posten läggs in så fungerar det, men sen när nästa läggs in så har @@identity-posten skrivits över med senast inlagda id från tblNarvarande (istället för från tblKvall). Någon som kan visa hur jag ska göra för att fixa detta?
Tack på förhand!
Någon som har något tips?
//mvh Björn
Sv: @@identity ändrar värde när den ska lägga in flera poster i en tabell med se
Lagra undan värdet INNAN din insert mot childtabellen.
/mickeSv:@@identity ändrar värde när den ska lägga in flera poster i en tabell med se
Tack för svaret. Jag är nog ganska införstådd på detta. Men hur gör jag det? Försökte på lite olika sätt men vet inte hur jag skriva koden riktigt...
//mvh BjörnSv: @@identity ändrar värde när den ska lägga in flera poster i en tabell med se
"SELECT @@identity"
Sv:@@identity ändrar värde när den ska lägga in flera poster i en tabell med se
Menar du så här:
Dim strSql3 as string = "SELECT * FROM tblNarvarande"
Dim Dr3 as OLEDBDatareader = datareader_data(strSql3)
'// For-loop som körs för alla rutor. Kollar för varje gång om någon ruta är vald, om den är det så ska ny post skrivas till tblNarvarande
Dim i as integer
Dim NyttKvall_id as string = "SELECT @@identity"
For i=0 To BoxNarvarande.Items.Count - 1
If BoxNarvarande.Items(i).Selected Then
'Dim sql4 as string = "INSERT INTO tblNarvarande(kvall_id,medlem_id) VALUES(" & "@@identity" & "," & boxNarvarande.items(i).value & ")"
Dim sql4 as string = "INSERT INTO tblNarvarande(kvall_id,medlem_id) VALUES(" & NyttKvall_id & "," & boxNarvarande.items(i).value & ")"
'response.Write(sql4)
'// Command-objekt
Dim Cmd2 as new OLEDBCommand(sql4, Con)
'// Köra frågan mot databasen
Cmd2.executeNonQuery()
End If
Next
'// Stäng anslutningen
Con.close()
'// Förhindra låsning
Dr2.close()
Dr3.close()
Eller?
//mvh Björn
Sv: @@identity ändrar värde när den ska lägga in flera poster i en tabell med se
Hela koden ser ut så här:
<%@ Page Language="VB" Debug="true" ContentType="text/html" ResponseEncoding="iso-8859-1"%>
<!--#include file="inkluderingsfiler/globalt.inc.aspx" -->
<%@ Import Namespace="System.data" %>
<%@ Import Namespace="System.data.oledb" %>
<%@ Import Namespace="system.web.mail" %>
<script language="VB" runat="server">
'***************************************************************************************
' Page_load körs direkt när sidan laddas
'***************************************************************************************
sub page_load()
if isPostBack = false then
'// sql-sats för att allt från tblMedlem
Dim sql as string
sql="SELECT tblMedlem.* FROM tblMedlem ORDER BY fornamn"
'// deklarera dr som ett OLEDBDatareader-objekt. Anropar funktionen datareader_data med
'// sql-satsen, funktionen returnerar just ett OLEDBDatareader-objekt.
Dim Dr as OLEDBDatareader = datareader_data(sql)
'// Bind datan till dropdown-menyn med förnamn
boxNarvarande.dataSource=Dr
boxNarvarande.databind()
dr.close()
else
end if
end sub
'***************************************************************************************
'***************************************************************************************
' registrera_klick körs när användaren trycker på Ok-knappen.
'***************************************************************************************
sub regKvall(sender As Object, e As EventArgs)
'***************************************************************************************
'Lagra datum, rubrik och brödtext tillsammans med hos vem kvällen var hos i tblKvall
'***************************************************************************************
Dim Con as new OLEDBConnection(db)
'Metoden open öppnar anslutningen
Con.open()
Dim strSql2 as string = "SELECT * FROM tblKvall"
'// Hämta data från databasen med hjälp av funktionen datareader_data
Dim Dr2 as OLEDBDatareader = datareader_data(strSql2)
'// sql-sats som lägger in textboxarnas värde i en ny post i tblKvall (tillsammans med medlem_id = vem kvällen var hos)
dim sql as string = "INSERT INTO tblKvall(datum,rubrik,brodtext,medlem_id) VALUES('" & txtDatum.text & "','" & txtRubrik.text & "','" & txtBrodtext.text & "'," & session("medlem_id") & ")"
'response.Write(sql)
'// Command-objekt
dim Cmd as new OLEDBCommand(sql, Con)
'// Köra frågan mot databasen
Cmd.executeNonQuery()
'***************************************************************************************
'Hämta hem allt från tblNarvarande
'***************************************************************************************
Dim strSql3 as string = "SELECT * FROM tblNarvarande"
Dim Dr3 as OLEDBDatareader = datareader_data(strSql3)
'***************************************************************************************
'***************************************************************************************
'For-loop som körs för alla rutor. Om ruta är vald så ska ny post skrivas till tblNarvarande
'***************************************************************************************
Dim i as integer
'Const NyttKvall_id as string = "@@identity"
For i=0 To BoxNarvarande.Items.Count - 1
If BoxNarvarande.Items(i).Selected Then
Dim sql4 as string = "INSERT INTO tblNarvarande(kvall_id,medlem_id) VALUES(" & "@@identity" & "," & boxNarvarande.items(i).value & ")"
'response.Write(sql4)
'// Command-objekt
Dim Cmd2 as new OLEDBCommand(sql4, Con)
'// Köra frågan mot databasen
Cmd2.executeNonQuery()
End If
Next
'// Stäng anslutningen
Con.close()
'// Förhindra låsning
Dr2.close()
Dr3.close()
'response.Redirect("create3.aspx")
end sub
'***************************************************************************************
'***************************************************************************************
'Funktion för att hämta data från databasen
'***************************************************************************************
'Anropas så här:
' Dim Dr as OLEDBDatareader
' Dr = datareader_data("sql-satsen här")
function datareader_data(sql as String) as OLEDBDatareader
'// Deklarera och öppna anslutning
Dim Con as new OLEDBConnection(db)
Con.open()
'// Hämta info från databasen med hjälp av sql-satsen och anslutnings-objektet
Dim Cmd as New OLEDBCommand(sql,Con)
'// Skapa en datareader att lägga information i
Dim Dr as OLEDBDatareader
'// Knyt info från command-objekt till vår datareader
Dr = Cmd.executeReader(Commandbehavior.closeConnection)
'// Returnera datareader
return Dr
'// stäng anslutningen
con.close()
'// stäng datareadern
dr.close()
end function
'***************************************************************************************
Tack på förhand,
//mvh Björn
Sv:@@identity ändrar värde när den ska lägga in flera poster i en tabell med se
Kan du förklara lite tydligare? Var ska jag skriva detta?
Tack på förhand,
//mvh BjörnSv: @@identity ändrar värde när den ska lägga in flera poster i en tabell med se
öppna connection
kör din insert mot mastertabellen
skapa ett kommando som kör "SELECT @@identity"
variabeln = command.executescalar()
Kör dina inserts mot childtabellen - skicka in VARIABELN som foreign key kolumn.
/mickeSv:@@identity ändrar värde när den ska lägga in flera poster i en tabell med se
Stort tack för din hjälp. Nu funkar det äntligen! :-)
Bifogar kod på hur det ser ut när det fungerar. Är denna metod felsäker nu? Jag menar om det sitter två stycken och lägger in kvällar samtidigt, det är ingen risk att knytningarna blir fel? Så att t ex kille nr 1s senaste inlagda post hämtas in som @@identity för kille nr 2?
Tack,
//mvh Björn
<%@ Page Language="VB" Debug="true" ContentType="text/html" ResponseEncoding="iso-8859-1"%>
<!--#include file="inkluderingsfiler/globalt.inc.aspx" -->
<%@ Import Namespace="System.data" %>
<%@ Import Namespace="System.data.oledb" %>
<%@ Import Namespace="system.web.mail" %>
<script language="VB" runat="server">
'***************************************************************************************
' Page_load körs direkt när sidan laddas
'***************************************************************************************
sub page_load()
'// kolla så att är inloggad, om inte redirect till logon.aspx
Dim medlem_id as integer = Session("medlem_id")
if medlem_id <=0 then response.redirect("logon.aspx")
if isPostBack = false then
'// sql-sats för att allt från tblMedlem
Dim sql as string
sql="SELECT tblMedlem.* FROM tblMedlem ORDER BY fornamn"
'// deklarera dr som ett OLEDBDatareader-objekt. Anropar funktionen datareader_data med
'// sql-satsen, funktionen returnerar just ett OLEDBDatareader-objekt.
Dim Dr as OLEDBDatareader = datareader_data(sql)
'// Bind datan till dropdown-menyn med förnamn
boxNarvarande.dataSource=Dr
boxNarvarande.databind()
dr.close()
else
end if
end sub
'***************************************************************************************
'***************************************************************************************
' registrera_klick körs när användaren trycker på Ok-knappen.
'***************************************************************************************
sub regKvall(sender As Object, e As EventArgs)
'***************************************************************************************
'Lagra datum, rubrik och brödtext tillsammans med hos vem kvällen var hos i tblKvall
'***************************************************************************************
Dim NyttKvallid as string
Dim Con as new OLEDBConnection(db)
'Metoden open öppnar anslutningen
Con.open()
Dim strSql2 as string = "SELECT * FROM tblKvall"
'// Hämta data från databasen med hjälp av funktionen datareader_data
Dim Dr2 as OLEDBDatareader = datareader_data(strSql2)
'// sql-sats som lägger in textboxarnas värde i en ny post i tblKvall (tillsammans med medlem_id = vem kvällen var hos)
dim sql as string = "INSERT INTO tblKvall(datum,rubrik,brodtext,medlem_id) VALUES('" & txtDatum.text & "','" & txtRubrik.text & "','" & txtBrodtext.text & "'," & session("medlem_id") & ")"
'response.Write(sql)
'// Command-objekt
dim Cmd as new OLEDBCommand(sql, Con)
'// Köra frågan mot databasen
Cmd.executeNonQuery()
cmd.commandtext = "SELECT @@identity"
NyttKvallid = convert.ToInt32(Cmd.ExecuteScalar())
'***************************************************************************************
'Hämta hem allt från tblNarvarande
'***************************************************************************************
Dim strSql3 as string = "SELECT * FROM tblNarvarande"
Dim Dr3 as OLEDBDatareader = datareader_data(strSql3)
'***************************************************************************************
'***************************************************************************************
'For-loop som körs för alla rutor. Om ruta är vald så ska ny post skrivas till tblNarvarande
'***************************************************************************************
Dim i as integer
For i=0 To BoxNarvarande.Items.Count - 1
If BoxNarvarande.Items(i).Selected Then
'Dim NyttKvall_id as string = "@@identity"
Dim sql4 as string = "INSERT INTO tblNarvarande(kvall_id,medlem_id) VALUES(" & NyttKvallid & "," & boxNarvarande.items(i).value & ")"
'response.Write(sql4)
'// Command-objekt
Dim Cmd2 as new OLEDBCommand(sql4, Con)
'// Köra frågan mot databasen
Cmd2.executeNonQuery()
End If
Next
'// Stäng anslutningen
Con.close()
'// Förhindra låsning
Dr2.close()
Dr3.close()
'response.Redirect("create3.aspx")
end sub
'***************************************************************************************
'***************************************************************************************
'Funktion för att hämta data från databasen
'***************************************************************************************
'Anropas så här:
' Dim Dr as OLEDBDatareader
' Dr = datareader_data("sql-satsen här")
function datareader_data(sql as String) as OLEDBDatareader
'// Deklarera och öppna anslutning
Dim Con as new OLEDBConnection(db)
Con.open()
'// Hämta info från databasen med hjälp av sql-satsen och anslutnings-objektet
Dim Cmd as New OLEDBCommand(sql,Con)
'// Skapa en datareader att lägga information i
Dim Dr as OLEDBDatareader
'// Knyt info från command-objekt till vår datareader
Dr = Cmd.executeReader(Commandbehavior.closeConnection)
'// Returnera datareader
return Dr
'// stäng anslutningen
con.close()
'// stäng datareadern
dr.close()
end function
'***************************************************************************************
Sv: @@identity ändrar värde när den ska lägga in flera poster i en tabell med se
@@identity gäller för din connection, så du kan ha 1000 andra (eller 2) som jobbar - och du har kvar "din" identity så länge du är ansluten.
/micke