Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Ne radi mi "Select @@IDENTITY..." a ne znam zašto??

[es] :: Access :: Ne radi mi "Select @@IDENTITY..." a ne znam zašto??

[ Pregleda: 3170 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mika
NBG-ML

Član broj: 55
Poruke: 640
*.adsl.static.sezampro.yu.



+1 Profil

icon Ne radi mi "Select @@IDENTITY..." a ne znam zašto??05.10.2006. u 12:38 - pre 213 meseci
Pozdrav, dešava mi se jedan čudan problem. Naime u aplikaciji koju radim, potrebno je da uradim dva sekvencijalna upisa, putem INSERT INTO... upita. Prvi upit generiše novi record, a ID broj generisan po AutoNumber polju mi treba za drugi upit. Malo sam lutao po netu i tražio koja je funkcija za vraćanje poslednjeg automatski generisanog AutoNumber polja i našao funkciju SELECT @@IDENTITY koja vredi za JET 4.0 baze. Sledeći kod koji sam postavio ne radi, ali pitam se zašto:

Code:
       
        DoCmd.OpenQuery "qryInsertData"    'Ubacuje record u tabelu

        'Set rst = db.OpenRecordset("SELECT @@IDENTITY AS insert_id FROM tblData")    'tblData je tabela u koju je prethodno ubacen record
        
    With rst
        .ActiveConnection = CurrentProject.Connection
        .Source = "SELECT @@IDENTITY AS insert_id FROM tblData"
        .CursorType = adOpenKeyset
        .LockType = adLockBatchOptimistic
        .Open
    End With

        LastId = rst.Fields("insert_id")
        MsgBox LastId


Takođe, kad u query designeru pokrenem taj SELECT @@IDENTITY upit, on ne vraća ništa, tj. vraća nula. Napominjem, da je qryInsertData upit uspešno odrađen, tj. taj novi record se nalazi u tabeli. U čemu bi mogao da bude problem?

Moguće da mi baza nije Jet 4.0, kako se to proverava? Od početka je baza razvijana u Ms ACCESS-u 2003.

Pozdrav, Hvala!
Bolje 100 godina biti milioner nego nedelju dana siromašak
(c) Alan ford
 
Odgovor na temu

mika
NBG-ML

Član broj: 55
Poruke: 640
*.adsl.static.sezampro.yu.



+1 Profil

icon Re: Ne radi mi "Select @@IDENTITY..." a ne znam zašto??05.10.2006. u 13:49 - pre 213 meseci
Evo da odgovorim sam sebi, našao sam rešenje problema na Microsoft knowledge base-u (http://support.microsoft.com/default.aspx/kb/232144):

Code:

Dim cnDatabase As ADODB.Connection
Dim rsNewAutoIncrement As ADODB.Recordset
Dim strConn As String
Dim strSQL As String
Dim strPathToMDB As String
   
strPathToMDB = "C:\test.MDB"
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
           "Data Source=" & strPathToMDB & ";"
Set cnDatabase = New ADODB.Connection
    cnDatabase.Open strConn
    
    strSQL = "CREATE TABLE AutoIncrementTest " & _
             "(ID int identity, Description varchar(40), " & _
             "CONSTRAINT AutoIncrementTest_PrimaryKey PRIMARY KEY (ID))"
    cnDatabase.Execute strSQL, , adCmdText + adExecuteNoRecords
    
    strSQL = "INSERT INTO AutoIncrementTest " & _
             "(Description) VALUES ('AutoIncrement Test')"
    cnDatabase.Execute strSQL, , adCmdText + adExecuteNoRecords
    
    strSQL = "SELECT @@Identity"
    Set rsNewAutoIncrement = New ADODB.Recordset
    rsNewAutoIncrement.Open strSQL, cnDatabase, adOpenForwardOnly, _
                            adLockReadOnly, adCmdText
    MsgBox "New Auto-increment value is: " & rsNewAutoIncrement(0).Value

    rsNewAutoIncrement.Close
    Set rsNewAutoIncrement = Nothing
    strSQL = "DROP TABLE AutoIncrementTest"
    cnDatabase.Execute strSQL, , adCmdText + adExecuteNoRecords
    cnDatabase.Close
Set cnDatabase = Nothing


...dakle, ovaj primer lepo kreira jednu tabelu u bazi c:\test.mdb i ispisuje vrednost AutoIncremental polja. Simply as that.

Koristan link:
http://databases.aspfaq.com/ge...ue-for-the-row-i-inserted.html

Bolje 100 godina biti milioner nego nedelju dana siromašak
(c) Alan ford
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com.



+79 Profil

icon Re: Ne radi mi "Select @@IDENTITY..." a ne znam zašto??05.10.2006. u 14:00 - pre 213 meseci
Treba da znamo st ti je back end baza. razlicito se radi ako je back end MDB i ako je back end MS SQL.

Ako je back end MDB - Access baza, onda ne mozes kosrititi @@IDENTITY - takva funkcija ne postoji u Accessu. Ti koristis ADO. ADO mora da ima neki metod koji moze da prepozna koji je poslednji rekord koji si upravo dodao, pa onda procitas polje koje te zanima. Da koristis DAO, rekao bih ti da koristis LastUpdated (ili tako nekako) property/metod za rekordset. Takodje bi morao umesto DoCmd.OpenQuery "qryInsertData" da odradis INSERT kroz DAO.AddNew - DAO.Update metode. Pogledaj help za ADO, verovatno postoji nesto sto ti moze dati odgovor na pitanje 'koji sam poslednji rekord insertovao"

Ako je back end MS SQL, opet ne ide @@IDENTITY. I opet ne moze DoCmd.OpenQuery "qryInsertData"

Trebao bi da napravis stored procedure koja radi nesto kao:
BEGIN
INSERT INTO myTable Field1, field2,... VALUES (Value1, Value2...)
RETURN SCOPE_IDENTITY()
END

Onda tu proceduru pozoves iz Accessa ili iz neke druge procedure. Komplikovano? Jeste. Kako bi bilo manje komplikovano? Predji sa autonumber/identity na prirodni Primary Key. Onda ces morati da izracunas vrednost PK pre nego se odlucis na INSERT INTO.

Izvod iz MS SQL help-a:
Citat:

SCOPE_IDENTITY
Returns the last IDENTITY value inserted into an IDENTITY column in the same scope. A scope is a module -- a stored procedure, trigger, function, or batch. Thus, two statements are in the same scope if they are in the same stored procedure, function, or batch.

Syntax
SCOPE_IDENTITY( )

Return Types
sql_variant

Remarks
SCOPE_IDENTITY, IDENT_CURRENT, and @@IDENTITY are similar functions in that they return values inserted into IDENTITY columns.

IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. IDENT_CURRENT returns the value generated for a specific table in any session and any scope. For more information, see IDENT_CURRENT.

SCOPE_IDENTITY and @@IDENTITY will return last identity values generated in any table in the current session. However, SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope.

For example, you have two tables, T1 and T2, and an INSERT trigger defined on T1. When a row is inserted to T1, the trigger fires and inserts a row in T2. This scenario illustrates two scopes: the insert on T1, and the insert on T2 as a result of the trigger.

Assuming that both T1 and T2 have IDENTITY columns, @@IDENTITY and SCOPE_IDENTITY will return different values at the end of an INSERT statement on T1.

@@IDENTITY will return the last IDENTITY column value inserted across any scope in the current session, which is the value inserted in T2.

SCOPE_IDENTITY() will return the IDENTITY value inserted in T1, which was the last INSERT that occurred in the same scope. The SCOPE_IDENTITY() function will return the NULL value if the function is invoked before any insert statements into an identity column occur in the scope.

See Examples for an illustration.

 
Odgovor na temu

mika
NBG-ML

Član broj: 55
Poruke: 640
*.adsl.static.sezampro.yu.



+1 Profil

icon Re: Ne radi mi "Select @@IDENTITY..." a ne znam zašto??05.10.2006. u 14:09 - pre 213 meseci
Xexe kao što vidiš, u slično vreme sam uspeo da napišem post kad i ti, pa sam tek preko mail-a provalio to.

LM, ni meni nije jasno, ali kao što vidiš - SELECT @@IDENTITY radi preko MS Accessa i to dobro.

Drugo pitanje, kad se malo zadubim u tvoj odgovor jeste - da li se u praksi bolje pokazalo "ručno" praviti Primary Key i dodeljivati ga ili koristiti ACCESS/MS SQL ugrađene funkcije (AutoNumber i ostale)? Nekako mi logičnije da to prepustim DB engineu nego da se ručno zamlaćujem s tim, pravim rutinu koja pravi unique brojeve, sa mogućnošću greške.

Pozdrav, hvala lepo!
Bolje 100 godina biti milioner nego nedelju dana siromašak
(c) Alan ford
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com.



+79 Profil

icon Re: Ne radi mi "Select @@IDENTITY..." a ne znam zašto??05.10.2006. u 19:36 - pre 213 meseci
Svaka cast za post i hvala ti na trudu. Lepa caka.

Ja sam staromodan pa zaobilazim ADO. Ne bi trebalo da ga zaobilazim ali me mrzi da se menjam pod stare dane. Sto se tice izbora PK, nisam nigde tvrdio da se u praksi pokazalo bolje ovo ili ono. Sve zavisi u cijoj i kakvoj praksi. Izbor PK je suvise ozbiljna stvar da bi se olako prepustio nekakvom DB Engine, no o tome nekom drugom prilikom.
 
Odgovor na temu

Milos Milosevic
Beograd

Član broj: 98063
Poruke: 140
*.adsl.sezampro.yu.



Profil

icon Re: Ne radi mi "Select @@IDENTITY..." a ne znam zašto??13.10.2006. u 12:10 - pre 213 meseci
Izvinite sto se vracam na isto pitanje, ali imam isti problem - samo u C#/Access (ADO):

Code:

this.cmd.CommandText="SELECT @@IDENTITY";
conn.Open();
id=(int)cmd.ExecuteScalar();
conn.Close();


Ovako vraca id=0 i posle UPDATE.
Mozda treba drugacije?



[Ovu poruku je menjao diplIng dana 26.10.2006. u 11:19 GMT+1]
Vreme je tica koja te kiti šarenim perjem no koja će doći
i da počupa svoje Ako budeš suviše vezao dušu svoju za perje
vreme će ti sa perjem i dušu očupati Ah kako će tada biti
nagota tvoja

Sv Vl. Nikolaj Velimirović
 
Odgovor na temu

[es] :: Access :: Ne radi mi "Select @@IDENTITY..." a ne znam zašto??

[ Pregleda: 3170 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.