2013-07-29 28 views
5

Zastanawiam się, w jaki sposób mogę uzyskać ostatnią wygenerowaną wartość automatycznego numerowania z tabeli w innej db. Obecnie robię to:Korzystanie z @@ Identity

Do Until rsA.EOF 
    'Inserts new row here (works) 
    Set rs = New ADODB.Recordset 
    rs.Open "SELECT @@Identity" (Connection info) 
    SQLcmd = "UPDATE tbl SET col = " & rs("SELECT @@Identity").Value & " 
    (WHERE statement);" 
    DoCmd.RunSQL SQLcmd 
    rsA.MoveNext 
Loop 

Ale daje col wartość 0 zamiast nowo wygenerowanego autonumeru. Każdy pomysł, dlaczego? Lub inny sposób to zrobić?

+0

Zobacz http://stackoverflow.com/q/186544/11683 – GSerg

Odpowiedz

2

Nie pokazałeś kodu, który zawiera INSERT w innej bazie danych. Jeśli używasz do tego metody Execute obiektu połączenia ADO, uruchom zapytanie SELECT @@Identity z tego tego samego obiektu połączenia ... nie nowego połączenia z tym samym ciągiem połączenia. @@Identity można używać tylko w ramach tej samej sesji połączenia; w przeciwnym razie dostaniesz 0.

Rzeczywiście nawet nie potrzebujesz zestawu rekordów, aby przechwycić tę wartość. Jeśli obiekt połączenia ma nazwę conn, zwróci zestaw rekordów, ale nie trzeba go przypisać do zmiennej obiektu zestawu rekordów. Po prostu poproś o pierwszy element z zwróconego zestawu rekordów.

Debug.Print "most recent autonumber: " & _ 
    conn.Execute("SELECT @@Identity")(0) 
+1

+1 beat mnie do niego. Jak stwierdza @HansUp, kluczem jest użycie tego samego * połączenia *, a nie tylko tego samego ciągu połączenia. – mwolfe02

+0

Używam instrukcji SQL INSERT INTO SELECT. Po uruchomieniu conn.Execute (...) zwraca 0. – user2618908

+0

To nie powinno być problemem, jeśli wykonujesz 'INSERT' z obiektu połączenia ADO, a ty później' SELECT @@ Identity' z tego ten sam obiekt połączenia. Kod w mojej odpowiedzi został przetestowany w programie Access 2007. Nie pokazałem 'INSERT', ale mogę, jeśli to pomaga. – HansUp