2009-07-29 27 views
6

Sử dụng tập lệnh VBA trong Excel, tôi đang cố chèn hàng mới vào bảng và sau đó lấy lại giá trị danh tính của hàng đó. Nếu tôi chạy:Sử dụng "SELECT SCOPE_IDENTITY()" trong ADODB Recordset

INSERT INTO DataSheet(databaseUserID, currentTimestamp) 
VALUES (1, CURRENT_TIMESTAMP); 
SELECT SCOPE_IDENTITY() 

trong Management Studio, hàng được chèn vào và nó mang lại cho tôi giá trị nhận dạng trả về như mong đợi. Tuy nhiên, khi tôi chạy chính xác cùng một truy vấn thông qua một bản ghi ADODB trong VBA, tôi đang gặp rắc rối. Hàng thực sự được chèn, nhưng tôi không thể truy cập vào giá trị nhận dạng. Recordset liệt kê 0 trường và thực sự đã bị đóng. Tôi đã thử với và không có dấu chấm phẩy, và tôi cũng đã thử chạy truy vấn dưới dạng một giao dịch duy nhất. Cùng một thỏa thuận, không có súc sắc. Bất cứ ý tưởng những gì đang xảy ra?

Dưới đây là VBA của tôi:

Dim rs As ADODB.Recordset 
Dim cn As Connection 
Dim SQLStr As String 
Dim serverName As String 
Dim databaseName As String 

serverName = "MSSQLServer" 
databaseName = "QA" 
cxnStr = "Driver={SQL Server};Server=" & serverName & ";Database=" & databaseName & ";" 

SQLStr = "INSERT INTO DataSheet(databaseUserID, currentTimestamp) 
VALUES (1, CURRENT_TIMESTAMP); SELECT SCOPE_IDENTITY()" 
Set cn = New ADODB.Connection 
cn.Open cxnStr 
Set rs = New ADODB.Recordset 
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic 
MsgBox (rs.Fields(0).Value) 

Và hộp thông báo thất bại trong việc hiển thị vì rs.Fields(0).Value trả về null. Tôi đã thêm một đồng hồ vào rs, và, như tôi đã nói, hiển thị 0 trường sau truy vấn và cũng dường như bị đóng (state = 0).

Trả lời

8

Khi bạn chạy một loạt các lệnh sử dụng ADODB, tôi tin rằng nó chạy mỗi người riêng rẽ. Buộc thực hiện lệnh tiếp theo để chạy, bạn phải sử dụng như sau:

Set rs = rs.NextRecordset() 

Thay đổi cuối thói quen của bạn để những điều sau đây nên làm như lừa:

Set rs = New ADODB.Recordset 
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic 
Set rs = rs.NextRecordset 
MsgBox (rs.Fields(0).Value) 
+0

Đẹp! Hoạt động hoàn hảo, cảm ơn! – JoeCool

0

Xem điều gì xảy ra khi bạn xóa các giá trị adOpenKeySet và adLockOptimistic để chúng ở giá trị mặc định của chúng.

1

Trong rs.Open của bạn Hãy thử điều này

rs.Open SQLStr, cn, adCmdText

3

Bạn đang thực hiện hai câu lệnh, do đó bạn sẽ nhận được hai kết quả trở lại. đối tượng recordset chỉ có thể giữ một kết quả tại một thời điểm - để có được kết quả khác, bạn cần sử dụng phương thức NextRecordset.

Set rs = rs.NextRecordset 
Các vấn đề liên quan