2010-12-13 6 views
6

Tôi đang sử dụng VB.NET với Cơ sở dữ liệu Access, tôi chèn các giá trị nhưng sau đó tôi cần lấy ID được chèn cuối cùng (số tự động) và chèn vào bảng có liên quan.vb.net sql ID được chèn lần cuối

Tôi đã thử @@ IDENTITY và MAX (cột) nhưng @@ IDENTITY trả về số không và MAX không đáng tin cậy (đôi khi chậm chèn dữ liệu, vì vậy hãy lấy ID trước khi chèn).

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() 

Điều này được thực hiện bằng hai chức năng để mã trên có thể gây nhầm lẫn, nhưng chỉ lấy từ hai hàm. Hai câu lệnh được thực thi, nhưng tôi vừa chỉ ra một câu lệnh được thực hiện như một ví dụ.

Có và thay thế cho @@ IDENTITY và MAX, vì tôi có vẻ như không thấy có vấn đề gì với @@ IDENTITY?

Cảm ơn lời khuyên nào :).

+0

Xem chỉnh sửa cuối cùng của tôi về truy cập không hỗ trợ nhiều câu lệnh trong một lệnh. Bạn có thể xác nhận rằng nó thực sự hoạt động hoặc bạn đã đi cho một cách tiếp cận khác? –

Trả lời

6

Điều này hoàn toàn quan trọng hơn SELECT @@ IDENTITY được thực hiện trên cùng một kết nối (và giao dịch) so với chèn. Nếu phương thức getDataTable() của bạn tạo ra một kết nối mới cho mỗi cuộc gọi, thì đó là lý do tại sao nó không hoạt động.

Cập nhật

Một cách tiếp cận đó là một lợi thế là để thực hiện hai câu lệnh trong một

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

Cập nhật lại

Có vẻ như bạn không thể thực hiện nhiều chức năng như điều này đối với cơ sở dữ liệu MS Access, Running multiple SQL statements in the one operation.

+0

Xin chào, có, nó không tạo ra một kết nối mới. Nếu tôi chỉ thực hiện một kết nối trên tải biểu mẫu vào cơ sở dữ liệu, điều đó có hoạt động để chèn, cập nhật v.v. không? Cảm ơn – Elliott

+0

+1 Để cung cấp cách thức với phương thức 'ExecuteScalar', hãy gói hai câu lệnh SQL. Điều đó, tôi sẽ không bao giờ nghĩ về nó. =) –

+0

Cảm ơn đã sắp xếp nó. – Elliott

0

Bạn chỉ cần sử dụng mã sau đây. Tôi giả định rằng bạn đã sử dụng SQLDataSource và sự kiện là:

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