2010-03-08 38 views
15

Tôi đang cố di chuyển dữ liệu từ một bản ghi trực tiếp vào một mảng. Tôi biết điều này là có thể, nhưng đặc biệt tôi muốn làm điều này trong VBA như thế này đang được thực hiện trong MS Access 2003.Cách điền một mảng với dữ liệu bản ghi

Thông thường tôi sẽ làm một cái gì đó như sau để đạt được điều này:

Dim vaData As Variant 
    Dim rst As ADODB.Recordset 

    ' Pull data into recordset code here... 

    ' Populate the array with the whole recordset. 
    vaData = rst.GetRows 

gì khác biệt tồn tại giữa VB và VBA mà làm cho loại hoạt động này không hoạt động?

Điều gì về mối quan tâm về hiệu suất? Đây có phải là một hoạt động "đắt tiền" không?

+0

Bản ghi là một mảng và linh hoạt hơn nhiều so với mảng VBA (tức là tham chiếu theo tên cột và không chỉ là chỉ mục cột). Tại sao không chỉ sử dụng recordset trực tiếp? Tôi đã được lập trình trong VBA/DAO cho hơn một thập kỷ và chưa bao giờ sử dụng GetRows. Điều gì khiến bạn nghĩ rằng bạn cần nó? –

+0

Cụ thể để giảm thiểu thời gian kết nối với các đối tượng ADODB khác đang mở. –

+2

Thế còn ADO bị ngắt kết nối thì sao? –

Trả lời

1

Lý do thông thường là mẫu của bạn sẽ không hoạt động là thư viện thích hợp cho ADO chưa được tham chiếu (Tools-> Tham khảo, Microsoft ActiveX Data Objects x.x Library), nếu không, nó sẽ ổn.

0

Tôi đồng ý rằng có vẻ như đó có thể là sự cố tham chiếu.

Nếu bạn định gắn bó với truy cập/máy bay phản lực thì bạn có thể muốn xem xét việc sử dụng DAO vì mọi thứ đều bằng nhau sẽ nhanh hơn ADO. Dưới đây là một ví dụ nhanh

Public Sub Foo() 
Dim aFoo As Variant 
Dim db As DAO.Database 
Dim rst As DAO.Recordset 

Set db = DBEngine(0)(0) 
Set rst = db.OpenRecordset("tblFoo") 

With rst 
    .MoveLast 
    .MoveFirst 
    aFoo = .GetRows(.RecordCount) 
End With 

rst.Close 
db.Close 

End Sub 
16

Các mã sau đây làm việc cho tôi:

Dim rst   As ADODB.Recordset 
Dim vDat   As Variant 

Set rst = CurrentProject.Connection.Execute("select * from tblTemp4") 
vDat = rst.GetRows 

Thực hiện debug-biên dịch, như đã đề cập này có thể là vấn đề ref. Như đã nói, một số DAO perfer, nhưng hãy nhớ DAO đòi hỏi bạn phải làm một movelast. ADO thì không. Những ngày này, ADO hoặc DAO thực sự đi xuống để thích của bạn, và hiệu suất hiếm khi là một vấn đề. ADO có xu hướng sạch hơn một chút đối với một mô hình đối tượng, nhưng bất cứ điều gì mà familer của bạn cũng giống như lựa chọn tốt nhất trong hầu hết các trường hợp

+0

DAO không yêu cầu một .MoveLast trừ khi bạn muốn một recordcount chính xác, mà bạn hầu như không bao giờ thực sự cần (bạn chỉ cần biết nếu recordset trả về hồ sơ và recordcount luôn luôn là 1 hoặc nhiều hơn nếu bản ghi DAO trả về hồ sơ). Tôi thấy không có lý do để sử dụng ADO, đó là DEAD, DEAD, DEAD. DAO là một phần của một cơ sở dữ liệu trực tiếp đang được phát triển liên tục, và dường như tôi là tương lai để làm việc với dữ liệu Jet/ACE. –

+1

Tôi thấy bây giờ từ tìm kiếm thử nghiệm GetRows rằng nếu bạn vượt qua không có tham số cho nó, nó lấy chỉ có một hàng. Bạn có thể chọn một số lượng lớn tùy ý và bỏ qua .MoveLast và tránh các hit hiệu suất. Hoặc bạn có thể có được một bản ghi chính xác bằng cách kiểm tra bảng.Thuộc tính RecordCount, mặc dù điều đó không hoạt động trên các bảng được nối kết, vì vậy bạn phải sử dụng trực tiếp phần cuối (không phải tất cả những thứ khó mã hóa và chắc chắn hiệu quả hơn nhiều so với MoveLast trên một bản ghi lớn), nhưng nó sẽ không làm việc trên bất kỳ thứ gì khác ngoài bản ghi bảng đơn. –

+1

@ David-W-Fenton ADO không phải là DEAD? Ấm đun nước gọi nồi đen ở đây ... – Robino

1

Trong Access bạn có thể thực hiện tìm kiếm được lập chỉ mục. Đó là khéo léo phương pháp nhanh nhất và thậm chí nhanh hơn tìm kiếm trong mảng.

Set rs = CreateObject("ADODB.Recordset") 
    rs.CursorLocation = adUseServer 
    rs.Open "MyData", CurrentProject.Connection, , , adCmdTableDirect 
    rs.Index = "fieldX" 

    rs.Seek fieldXvalue 

Nếu bạn chỉ lặp qua toàn bộ bảng so với mảng thực sự là nhanh nhất. Một ngoại lệ: Về lý thuyết, nếu bạn có một khóa chính số, bạn có thể thiết lập chỉ mục đến cùng vị trí chính xác của nó trong mảng, vì vậy không có rs.find hoặc rs.seek, bạn chỉ có thể truy cập nó như mảng (index) và điều đó thật nhanh. Tôi không có điểm chuẩn so với tìm kiếm được lập chỉ mục, nhưng nó có thể nhanh hơn.

Các vấn đề liên quan