2013-06-21 29 views
7

Gần đây chúng tôi đã tạo và di chuyển phần phụ trợ Access DB của chúng tôi sang SQL Server. Tôi đang cố gắng, bằng cách sử dụng mã VBA, tạo một kết nối đến phụ trợ SQL Server và chạy một truy vấn passthrough với các kết quả được lưu trữ trong một bản ghi VB. Khi tôi thử điều này, truy vấn KHÔNG đi qua.Truy vấn qua lại máy chủ SQL làm cơ sở cho bản ghi DAO trong Access

Dim db As DAO.Database 
Dim rs As DAO.Recordset 
Dim strConnect As String 

strConnect = "DRIVER=SQL Server;SERVER=55.55.55.55 SQLExpress;UID=UserName;PWD=Password" 

Set db = OpenDatabase("DBName", dbDriverNoPrompt, True, strConnect) 

Set rs = db.OpenRecordset("SELECT GetDate() AS qryTest", dbOpenDynaset) 

MsgBox rs!qryTest 

rs.Close 
db.Close 
Set rs = Nothing 
Set db = Nothing 

Vấn đề tôi nhận được là GetDate() SQL chức năng máy chủ hoàn toàn phù hợp đang trở lại Runtime Error 3085 "User Defined Function 'getdate' trong khái niệm". Nếu tôi tạo truy vấn này giống như một passthrough trong MS-Access Query Builder, bên ngoài mã VBA, nó chạy tốt và trả về ngày và giờ của máy chủ, chỉ trong mã là nó không đi qua đúng.

+1

"đã di chuyển phần phụ trợ DB Access của chúng tôi sang SQL Server". Đề nghị của tôi bây giờ sẽ là di chuyển từ DAO sang ADO recordsets, nếu bạn yêu cầu truy vấn trong view quen thuộc thì passthroughs là rất tốt, nhưng nếu chỉ cần trong mã thì ADO là con đường để đi:) –

+0

Đó là kế hoạch cuối cùng. Thật không may tôi đang ở trong một môi trường mà tôi là người duy nhất kỹ thuật quản lý một DB được xây dựng bởi người khác 4 năm trước và tăng tốc khi tôi đi. Một bước tại một thời điểm, nhưng kế hoạch là để chuyển đổi sang ADO .... cuối cùng! – Mike

Trả lời

16

Bạn cần sử dụng đối tượng QueryDef để tạo truy vấn Qua, sau đó mở Recordset qua phương thức .OpenRecordset của QueryDef. Mã sau hoạt động cho tôi:

Dim qdf As DAO.QueryDef, rst As DAO.Recordset 
Set qdf = CurrentDb.CreateQueryDef("") 
qdf.Connect = "ODBC;Driver=SQL Server;Server=.\SQLEXPRESS;Trusted_Connection=Yes;" 
qdf.SQL = "SELECT GetDate() AS qryTest" 
qdf.ReturnsRecords = True 
Set rst = qdf.OpenRecordset 
Debug.Print rst!qryTest 
rst.Close 
Set rst = Nothing 
Set qdf = Nothing 
+0

Làm việc hoàn hảo, cảm ơn! Tôi đã thiếu sự cần thiết cho một QueryDef để làm việc này như là một passthrough! – Mike

0

Gord, bạn có thể cung cấp các mod cho mã thực thi một tham số được truyền và câu lệnh chèn không? Tôi đã làm việc với nó, nhưng không thể đánh bại nó. Tôi có mã cơ bản làm việc, vì vậy tôi đang nói chuyện với máy chủ một cách chính xác, tôi chỉ không nhận được OpenRecordset chính xác.

Về cơ bản, tôi đang thực hiện quy trình gồm ba bước: ghi nhật ký bắt đầu thực thi SP, thực thi SP, ghi nhật ký. Đây là các chuỗi SQL của tôi:

beginsql = " INSERT INTO [dbo_zSprocExecuteLog]" _ 
     & " values (sysdatetime(), 'uspGradePromotionDistrict', " _ 
     & [SeekerUserID] & ", 'B', '(" & [ReportDistrict] & ")';" 

    sqlstring = " EXEC uspGradePromotionDistrict" _ 
     & " @District = '" & [ReportDistrict] & "';" 

    endsql = " INSERT INTO [dbo_zSprocExecuteLog]" _ 
     & " values (sysdatetime(), 'uspGradePromotionDistrict', " _ 
     & [SeekerUserID] & ", 'E', '(" & [ReportDistrict] & ")';" 

Tôi đánh giá cao ý kiến ​​của bạn, điều này đã khiến tôi phát điên. Và bạn có thể giới thiệu một cuốn sách hay về lập trình Access/SQL không? Tôi đã có gobs kinh nghiệm về phía máy chủ SQL, Access Fu của tôi là một chút yếu.

+0

Đối với một đầu vào đơn giản, sau đó bạn không cần một pass-mặc dù. Đối với ví dụ về exec, hãy xem bài đăng của tôi tại đây: http://stackoverflow.com/questions/28727560/use-function-call-in-passthrough-query/28735619#28735619 –

0

Bạn không thể thực hiện INSERT INTO bảng cục bộ với truy vấn chuyển tiếp. Sử dụng truy vấn kết quả (mà bạn đã tạo với Querydef) làm nguồn cho INSERT.