2013-06-21 28 views
7

最近、Accessデータベースのバックエンドを作成してSQL Serverに移行しました。私は、VBAコードを使用して、SQL Serverバックエンドへの接続を作成し、VBレコードセットに格納された結果でパススルークエリを実行しようとしています。これを試すと、クエリは通過しません。AccessでのDAOレコードセットの基礎となるSQL Serverパススルークエリ

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 

私は取得しています問題は完全に適切なGetDate() SQL Serverの機能は、「式でユーザー定義関数 『のGetDate』」ランタイムエラー3085を返しているということです。 MS-Access Query Builderのパススルーと同じクエリをVBAコードの外に作成すると、正常に実行され、サーバーの日付と時刻が返されます。

+1

"AccessデータベースのバックエンドをSQL Serverに移行しました"私の提案は、DAOからADOレコードセットに移行することです。慣れ親しんだビューでクエリが必要な場合はパススルーが優れていますが、コードでのみ必要な場合はADOを使用してください) –

+0

これは最終的な計画です。不幸にも私は4年前に他の人が作成したDBを管理している唯一の技術者であり、私が行くにつれて増えていく環境にいます。一度に1ステップですが、計画はADOに移行することです....最終的に! – Mike

答えて

16

QueryDefオブジェクトを使用してパススルークエリを作成し、次にQueryDefの.OpenRecordsetメソッドを使用してRecordsetを開く必要があります。次のコードは私のために働いています:

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

完璧に働いた、ありがとう!私はパススルーとしてこれを動作させるためにQueryDefの必要性を見逃していました! – Mike

0

Gord、渡されたパラメータと挿入文でprocを実行するコードのmodを提供できますか?私はそれに取り組んできましたが、それを打ち負かすことはできませんでした。私は基本的なコードが働いているので、私はサーバーと正しく話しています、私はちょうどOpenRecordsetを正しいものにしていません。

基本的には、私は3段階のプロセスを行っています:SPの実行の開始を記録し、SPを実行し、最後を記録します。これらは私のSQL文字列です:

私はあなたの意見をいただければ幸いです。そして、Access/SQLプログラミングに関する良い本をお勧めしますか?私はSQL Server側での経験のgobsを持っている、私のアクセスFuは少し弱いです。

+0

単純な入力の場合、パススルーは必要ありません。 execの例については、ここに私の投稿を参照してください:http://stackoverflow.com/questions/28727560/use-function-call-in-passthrough-query/28735619#28735619 –

0

パススルークエリを使用してローカルテーブルにINSERT INTOを実行することはできません。結果のクエリ(Querydefで生成したもの)をINSERTのソースとして使用します。

関連する問題