2010-12-13 26 views
6

VB.NET'i bir Access Database ile kullanıyorum, değerler ekliyorum ancak son eklenen ID'yi (otomatik numara) almalı ve ilgili tabloya eklemeliyim.vb.net sql en son eklenen ID

@@ IDENTITY ve MAX (sütun) 'u denedim ancak @ IDENTITY sıfır döndürüyor ve MAX çok güvenilir değil (bazen veri eklemek yavaştır, böylece eklenmeden önce kimliği alın). Yukarıdaki kod kafa karıştırıcı görünebilir böylece

Dim insertSql = datalayer.getDataTable((String.Format("INSERT INTO users (username) VALUES ({0})", username))) 

Dim newID = datalayer.getDataTable((String.Format("SELECT @@IDENTITY FROM users"))) 


Dim con As OleDbConnection = getConnection() 
con.Open() 
Dim sqlCommand As OleDbCommand = New OleDbCommand(String.Format(insertSql), con) 
sqlCommand.ExecuteNonQuery() 

Bu iki fonksiyonları yapılır, ancak bu sadece iki fonksiyonları alınan. İki ifade idam edildi, ancak sadece örnek olarak idam edildiğini gösterdim.

@@ KİMLİĞİ ve MAKSİMUM'a alternatif var mı, çünkü @@ IDENTITY ile nasıl yanlış gittiğimi görmüyorum?

Önerileriniz için teşekkürler :).

+0

erişim tek komutla birden ifadeleri desteklemeyen hakkında, benim son düzenleme bakın. Gerçekten çalıştığını veya başka bir yaklaşıma gittiğinizi doğrulayabilir misiniz? –

cevap

6

SELECT @@ IDENTITY uygulamasının insertten aynı bağlantı (ve işlem) üzerinde yürütülmesi kesinlikle çok önemlidir. GetDataTable() yönteminiz her çağrı için yeni bir bağlantı oluşturuyorsa, bu yüzden çalışmaz.

Güncelleme

tercih edilir başka bir yaklaşım yine

gibi birden fazla işlevi yürütmek olamaz gibi görünüyor biri

sql = "INSERT INTO...;SELECT @@IDENTITY..." 
Dim id = sqlCommand.ExecuteScalar(sql) 

Update iki ifadeyi yürütmektir Bu bir MS Access veritabanı, Running multiple SQL statements in the one operation karşı.

+0

Merhaba, evet, yeni bir bağlantı oluşturmuyor. Veritabanına form yükünde yeni bir bağlantı yapsaydım, bu da ekleme, güncelleştirme vb. Için çalışır mıydı? Teşekkürler – Elliott

+0

+1 İki SQL deyimini sarmak için 'ExecuteScalar' yöntemiyle bir yol sağlamak için. Bu, hiç düşünmezdim. =) –

+0

Teşekkürler. – Elliott

0

Aşağıdaki kodu kullanabilirsiniz. Sana SQLDataSource kullanılan ve olay olduğunu varsayalım:

Protected Sub SqlDataSource1_Inserted(sender As Object, e As SqlDataSourceStatusEventArgs) Handles SqlDataSource1.Inserted 
Dim query As String = "SELECT @@IDENTITY" 
Dim cmd As New OleDbCommand(query, CType(e.Command.Connection, OleDbConnection)) 
Dim newid As Integer = cmd.ExecuteScalar() 
l1.Text = newid 
End Sub