2016-12-30 22 views
0

私たちは、2000年に開発されたいくつかの古いレガシーアプリケーションを持って、私は、アプリケーションのモジュールを実行しようとしていたとき、我々は2007年にアクセス2003から移動してきた、それは私にエラーを与えている:DAOからADOへコードを書き換える方法は?

"Run-time error 3847. ODBCDirect is no longer supported. Rewrite the code to use ADO instead of DAO".

そして、それはラインSet WS = CreateWorkspace("NewWS", "", "", dbUseODBC)にハイライトします。私がアクセスに本当に新しいので、ここでこの問題を投稿する前に研究を行いましたが、運はありません。 DAOの代わりにADOを使うコードを書き直そうとしています。

以下は、私の古いVBAコードです:私は、コードを書き換えるために始めた

Public Function GetID (ByRef SegmentItem As clsSegmentDefinitions) As Long 
    Dim qdf As QueryDef 
    Dim qdfNewID As QueryDef 
    Dim rs As Recordset 
    Dim rsNewID As Recordset 
    Dim NaturalDescription As String 
    Dim WS As Workspace 
    Dim con As Connection 
    Set WS = CreateWorkspace("NewWS", "", "", dbUseODBC) 
    WS.DefaultCursorDriver = dbUseODBCCursor 
    Set con = WS.OpenConnection("", , , SQLConnectString) 
    DoCmd.Hourglass False 
    DoCmd.OpenForm " frmQuickAdd_AddNatural ", , , , , acDialog, SegmentItem.AddValue 
    DoCmd.Hourglass True 
    If Form_frmQuickAdd_AddNatural.Tag Then 
     Set qdf = con.CreateQueryDef("", "{ ? = call sp_Insert(?, ?, ?) }") 
     qdf.Parameters.Refresh 
     qdf![@prmDescription] = Left(Form_frmQuickAdd_AddNatural.txtSegmentDescription, 34) 
     qdf![@prmCreateUser] = CurrentUser 
     qdf![@prmProjectID] = 0 
     qdf.Execute 
     Set qdfNewID = CodeDb.CreateQueryDef("") 
     qdfNewID.Connect = SQLConnectString 
     qdfNewID.ReturnsRecords = True 
     qdfNewID.SQL = "sp_GetNewSegmentID" 
     Set rsNewID = qdfNewID.OpenRecordset 
     If Not IsNull(rsNewID!MaxOfSegmentID) Then 
      GetID = rsNewID!MaxOfSegmentID 
     Else 
      GetID = 0 
     End If   
    Else 
     GetID = 0 
    End If 
    DoCmd.Close acForm, "frmQuickAdd_AddNatural"  
End Function 

すべてで、このようにすると仮定した場合、私は見当もつかない。

Dim cnn As New ADODB.Connection 
Dim rst As New ADODB.Recordset 

cnn.Open "Provider=mssql;Data Source=" & dbq & ";User Id=" & uid & ";Password=" & pwd 
With rst 
    .Open "SELECT COUNT(*) FROM " & tbl, cnn, adOpenKeyset, adLockOptimistic 
    num = .Fields(0) 
    .Close 
End With 
cnn.Close 
Set rst = Nothing 
Set cnn = Nothing 
+0

ADOに書き直す作業はたくさんあります。あるいは、DAOを使用してODBC WorkSpaceを使用せずに作業することもできます。 – Gustav

+1

私はすべてをSQL Serverのフリー版に移植します。私はAccessとの時間を費やし、最近はまだバグがたくさんあります。恐ろしい。 –

+1

コードブロックを修正するためにあなたの質問を再フォーマットしましたが、あなたの質問は本質的には*あまりにも広すぎ*ました。 ADOに関する情報は、[Documentation.SO](http://stackoverflow.com/documentation/vba/3578/working-with-ado#t=201612301821243706514)にあります。特定の問題に取り組むと、*具体的な*質問があり、あなたに*特定の*回答を与​​えることができます。今では、他の人にあなたのために "翻訳"作業を依頼しているように見えますが、これはStack Overflowの目的ではありません。 –

答えて

2

まず、DAOの周りに構築され、設計されたアプリケーションにADOを導入したくありません。さらに悪いことに、ADOは現在約15年間撤退しています。実際、SQL ServerはADOが動作するoleDBのサポートを中止しています。 (そうしないでください)。業界が離れてADO、すべての主要なベンダーから移動してきた業界標準としてオープンデータベース接続を使用することを示唆している

http://blogs.msdn.com/b/sqlnativeclient/archive/2011/08/29/microsoft-is-aligning-with-odbc-for-native-relational-data-access.aspx

は、SQLサーバー落下OLEDBのサポートについては、このリンクを参照してください。 (つまり、ODBCを意味します)。

Accessでパススルークエリを作成して保存します。あなたのコードは、次にように書き換えることができます。

Public Function GetID(ByRef SegmentItem As String) As Long 

    Dim strSQL  As String 

    strSQL = "sp_Insert('" & _ 
      Left(Form_frmQuickAdd_AddNatural.txtSegmentDescription, 34) & "'," & _ 
      "'" & CurrentUser & "', 0)" 

    With CurrentDb.QueryDefs("qryPass") 
    .SQL = strSQL 
    .ReturnsRecords = False 
    .Execute 
    End If 

    With CurrentDb.QueryDefs("qryPass") 
    .SQL = "sp_GetNewSegmentID" 
    .ReturnsRecords = True 
    GetID = Nz(.OpenRecordset()("MaxOfSegmentID"),0) 
    End With 

End Function 

だから、1パスけれどもクエリを作成します。そして、あなたはJET-DIRECTを使用していたすべての場所でそれを使用することができます。アクセス2007では、ジェットダイレクトサポートは廃止されましたが、単純なパススルークエリを使用するだけで十分であり、上記のようにコーディングや開発時間のバケットを節約することもできます。あなたが持っている "左の"式がnullを返すことができるなら、おそらくnz()でその式をラップして ""(ヌル文字列)か適切な値を返す必要があります。

+0

返信いただきありがとうございます。私はパススルーに関する質問をオンラインで勉強しています。したがって、上記の "qrypass"はパススルークエリです。パススルークエリには何が入りますか?それはストアプロシージャsp_insertですか? – toofaced

+0

パススルークエリの中に必要なものを置くことができます。だから、tblCustomersのシンプルなセレクトカウント(*)でPTをテストするだけです。 PTクエリは、法的なt-SQL文で開始することができます。上の例では、そのPTクエリの.SQLテキストプロパティを何時でも変更することがあります。最初にPTクエリをクリックしてテストします。このコードを実行すると、上記のコードに従って.SQLプロパティが変更されます。これで、あなたはそのPTクエリにANY t-sqlを詰め込み+使用することができます。また、コードで接続文字列を混乱させることなく、ジェットダイレクトコードを置き換えるうえでうまく機能することを意味します。 –

+0

qryPassはPTクエリに使用した名前です。これは任意の名前にすることができます。 DAOレコードセットコードの残りの部分を書き直す必要がなく、前と同じように動作するので、このアプローチが好まれます。したがって、このアプローチは、既存のDAOレコードセットコードの変更量を最小限に抑えます。 –

関連する問題