2012-05-05 37 views
5

フォームがロードされ、エラーメッセージやコード区切りが表示されないときは、このコードをデータシートのサブフォームで実行しています。私のdebug.printは、Recordset rsが2131レコードであるはずですが、私のフォームが#Nameの1行を表示していることを示していますか?すべての分野で私のコントロールのコントロールソースプロパティは、私が上に挙げたフィールド名と最もよく一致します。 RSはフォームレベルの変数であり、フォームを閉じるまで何も設定しません。メモリ内のスタンドアロンの切断されたADOレコード

私は間違って何を考えていますか?

Set rs = New ADODB.Recordset 
rs.Fields.Append "TimesUsed", adInteger 
rs.Fields.Append "strWorkType", adVarWChar, 150 
rs.Fields.Append "DateLastUsed", adDate 
rs.Fields.Append "SelectedYN", adBoolean 
Set rs.ActiveConnection = Nothing 
rs.CursorLocation = adUseClient 
rs.LockType = adLockBatchOptimistic 
rs.Open 

Dim sSQL As String 
sSQL = "MyComplicated SQL Statement Ommitted from this SO Question" 

Dim r As DAO.Recordset 
Set r = CurrentDb.OpenRecordset(sSQL, dbOpenDynaset, dbSeeChanges) 
If Not (r.EOF And r.BOF) Then 
    r.MoveFirst 
    Dim fld 
    Do Until r.EOF = True 
     rs.AddNew 
     For Each fld In r.Fields 
      rs(fld.Name) = r(fld.Name).value 
     Next 
     rs.Update 
     r.MoveNext 
    Loop 
End If 
r.Close 
Set r = Nothing 
Debug.Print rs.RecordCount '2131 records 
Set Me.Recordset = rs 

OK、私はちょうどthis on the MSDN siteをお読みください。

レコードセットは、テーブルの主キーとして一意インデックス化されている1つ以上のフィールドを、含まれている必要があります。

(注:この情報は、この文脈では誤っていると思われます。)

+2

後rstADO.MoveFirst & rstADO.MoveLastを使用します。しかし、企業向けに開発する必要はありませんでしたので、大量のデータ(10,000レコード以上)をデータシートビューに取り込むことに慣れています。私たちがODBC Linked TableでDAOを使用しているにもかかわらず、私たちのサーバーにGigabit Ethernetと高速ハードドライブを使用しても、ユーザーからの苦情はありません。だから、私は今のところ、「これまで」実際にはかなりうまくいっていると言っているほど私のアプローチを賛成ではない。 – HK1

答えて

4

私はこの作品を作ることができる唯一の方法は、種類のLockTypeにadLockPessimisticまたはadLockOptimisicを使用することであることが判明:ダニーLesandriniすることにより、データベース・ジャーナルからのこの記事が役に立つ場合

rs.Fields.Append "pkey", adInteger, , adFldKeyColumn 

も参照してください。 adLockReadOnlyは明白な理由で機能しません。何らかの理由により、レコードセットが完全に機能しているように見えても、adLockBatchOptimisticではフォームが表示されません。

フォームにバインドされているこのタイプの切断されたレコードセットに対してプライマリキーを定義する必要はありません。フォームを介してレコードセットの編集や更新を行うことができないと確信していますが、私のテストでは、このタイプのフォーム/レコードセットを編集できないことがわかりました。なぜなら、エラー3270 (不足している財産と関係するもの)。それは本当にこの質問の範囲外です。

ここでワーキングメモリ内のレコードセットを作成するために必要な最小限のコードがあります:

Dim rs As ADODB.Recordset 'Form Level variable 

Private Sub Form_Load() 
    Set rs = New ADODB.Recordset 
    rs.Fields.Append "ID", adInteger 
    'Set rs.ActiveConnection = Nothing 'Not Required 
    'rs.CursorType = adOpenKeyset 'Not Required 
    'rs.CursorLocation = adUseClient 'Not Required 
    rs.LockType = adLockPessimistic 'May also use adLockOptimistic 
    rs.Open 

    Dim i as Integer 

    For i = 1 To 10 
     rs.AddNew 
     rs("ID").Value = i 
     rs.Update 
    Next i 

    Set Me.Recordset = rs 
End Sub 

それは最初の切断されたレコードのこのタイプのフォーム(私の場合は、データシートビュー)を結合することだろうと私に登場私の特定のニーズに対して、良い、簡単な解決策になります。しかし、私はいくつかの問題に遭遇しました。 ADOレコードセットにフォームがバインドされている場合、既定のフォームの並べ替えが動作していないように見えます。また何らかの理由で私はこのレコードセットを編集可能/更新可能にすることはできませんでした。これは私のニーズに必要なものでした(基本的には複数チェックリストとして使用していました)。テーブルからレコードセットを取得した場合(空のテーブルであっても)、切断するとこの問題を回避できます。どうやらテーブルには、上記のコードで設定できなかった構造やプロパティがあります。レコードを追加/編集しようとすると、3270エラーメッセージが表示されます。そして、私はそれらのプロパティが何であるか、またはそれらを設定する方法を理解していません。

結論として、私は、Access "temp"テーブルを使用することに頼ると思います。これは、あまり複雑でなく、上に示した問題がないからです。

+0

過去数日で、単純なメモリ内データセットを作成するという同様の要望がありました。私も同様の不満を持ち、あきらめました。 –

7

はそれがセットアップにのみ可能で、メモリ内のオブジェクトであるレコードの主キーのですか?

はい、adFldKeyColumnAttribからAppend Methodに設定してください。詳細はFieldAttributeEnumを参照してください。

SQLステートメントで使用できる適切な一意のフィールド(またはフィールドの組み合わせ)が既にある場合は、それを使用します。そうでない場合は、長い整数フィールドを作成し、偽の主キーフィールドとして使用します。挿入する各行の値を増やします。 Create In-Memory ADO Recordsets

+0

私は上記のようにプライマリキーフィールドを追加しましたが、それを設定しましたが、まだ#Nameが表示されていますか?私のすべての分野で私はうんざりしている。 – HK1

4

注:私は変更フォームのコードに以下のその後 Create In-Memory ADO Recordsets で上記の例を使用して新しいレコード を挿入するとともに、正しく動作するためにすべてを取得することができました... 「注意:トリックにしましたこれは、小さなテーブル(4つのフィールド)であるrstADO.Update

Option Compare Database 
Dim rstADO As ADODB.Recordset 
Dim lngRecordID As Long 

Private Sub Form_BeforeInsert(Cancel As Integer) 

    lngRecordID = lngRecordID + 1 
    rstADO.AddNew 
    rstADO("EmployeeID").value = lngRecordID 
    rstADO.Update 
    rstADO.MoveFirst 
    rstADO.MoveLast 

End Sub 

Private Sub Form_Load() 

    Dim fld As ADODB.Field 

    Set rstADO = New ADODB.Recordset 
    With rstADO 
     .Fields.Append "EmployeeID", adInteger, , adFldKeyColumn 
     .Fields.Append "FirstName", adVarChar, 10, adFldMayBeNull 
     .Fields.Append "LastName", adVarChar, 20, adFldMayBeNull 
     .Fields.Append "Email", adVarChar, 64, adFldMayBeNull 
     .Fields.Append "Include", adInteger, , adFldMayBeNull 
     .Fields.Append "Selected", adBoolean, , adFldMayBeNull 

     .CursorType = adOpenKeyset 
     .CursorLocation = adUseClient 
     .LockType = adLockPessimistic 
     .Open 
    End With 
    Set Me.Recordset = rstADO 

End Sub 

Private Sub Form_Unload(Cancel As Integer) 

    Set rstADO = Nothing 

End Sub 
関連する問題