2011-12-15 14 views
3

私はVS2008、V3.5を使ってVB6ウィンドウアプリケーションをC#に変換しています。私はデータの格納と検索に使用するSQL Server 2000データベースを持っています。 C#のでC#adodbレコードセットと同等

OpenDBCon 
Set rst = New ADODB.Recordset 
rst.Open "SELECT idx From tblQuoteIdx", cn, adOpenDynamic, adLockPessimistic 
Select Case rst.BOF 
Case False 
    rst.MoveFirst 
     Me.txtRef = rst!idx 
     tID = rst!idx + 1 
    OKToContinue = True 
Case False 
    'Do something 
End Select 

If OKToContinue = True Then 
    Set rst = New ADODB.Recordset 
    rst.Open "update tblQuoteIdx set idx = '" & tID & "' ", cn, adOpenDynamic, 
    adLockPessimistic 
End If 
CloseDBCon 

私は現在、このやっている:

 SqlConnection conn = new SqlConnection(); 
     conn.ConnectionString = Vars.connstring; 
     conn.Open(); 
     SqlCommand sqlComm = new SqlCommand("Select idx from tblQuoteIdx", conn); 
     Int32 tt = (Int32)sqlComm.ExecuteScalar(); 
     Int32 tt2 = tt++; 
     SqlCommand sqlComm2 = new SqlCommand("Update tblQuoteIdx set " + 
     "idx = " + tt2 + "", conn); 
     sqlComm.ExecuteNonQuery(); 
     conn.Close(); 
を一つのテーブルには、私は次の操作を行いVB6でInt型のものであり、引用番号を生成するために使用されている単一のレコード、すなわち、123456を保持しています

残念ながら、同じインデックス番号の複数のインスタンスが同時に表示されたときに、複数のユーザーが同時にレコードにヒットしたときに、カーソルロックが「adLockPessimistic」になっていないことがわかりました。誰もがこの特定の目的のためにC#でADODB.Recordsetを使用する方法を説明するか、必要に応じてdbレコードをロックするためにレコードロックを使用するか、または.NETフレームワークとC#プリンシパルのより良い方法で同じことを達成できます、私は素晴らしいだろう。事前に多くの感謝。

ノエル

+0

ADO.NETを調べましたか? –

+0

トランザクションでラップする –

+0

私はあなたの投稿権を読んでいるなら、IDフィールドに同じ値を持つ別のレコードを避けようとしています。ほとんどのデータストレージ製品は、デフォルトでこれをサポートしています。もしあなたが作成失敗(try-catch-finallyブロックを介して)中に新しいIDを1つずつ自動的にインクリメントし、異なるユーザーセグメントに対して異なるIDステッピングチェーンを実行し、パフォーマンスを構築するデータの検証とそれに続く提出の責任を負うサービスキューイングデータの提出は、RCが言及したトランザクションでラッピングすることはおそらく最も簡単です。 – Hardryv

答えて

2

私はあなたがこの記事が役立つだろうと信じて: Pessimistic locking in ado.net 基本的には、すぐに編集を開始して、レコードのロックを適用するトランザクションのすべてをラップする必要があります。この方法では、ロックが解放されるまで他の方法で値を編集することはできません。