1

可能であれば、アプリケーション側で数値をインクリメントし、C# と Linq を使用してデータベースに保存したいと考えています。

たとえば、次のようなテーブルがあります。

|id|text|version|
-----------------
 1  hello   1
 2  hello   1

このテーブルに新しいレコードを挿入するときに、現在のバージョン番号を取得し、1 ずつ増やしてから新しい行を挿入したい

|id|text|version|
-----------------
 1  hello   1
 2  hello   1
 1  hello   2

私はlinqを使用して標準の挿入を行うことができますが、明らかにバージョンをどうするかについて固執しています

DataContext db = new DataContext

using (db)
{
    table t = new table
      {
         text = TextBox1.Text
         version = ??
      };

db.table.InsertOnSubmit(t);
db.SubmitChanges();
}

どういうわけか行を選択して現在のバージョン番号を取得し、1 ずつ増やすことはできますか? それとも、自分のアプローチを再考する必要がありますか?

ありがとう

4

3 に答える 3

3

まず、このロジックをトランザクション内にラップする必要があります。テーブルがロックされ、同時実行の問題が回避されます。その後、バージョンの最大値を選択して 1 ずつ増やすことができます。

using(var scope = new TransactionScope(TransactionScopeOption.Required,
                      new TransactionOptions{IsolationLevel = IsolationLevel.Serializable}))
{
    using(var dataContext = new DataContext())
    {
        var version = dataContext.Table.Where(item => item.Text == textBox1.Text)
                                       .Max(item => item.Version);
        var t = new Table
        {
            Text = textBox1.Text,
            Version = version + 1
        };
        dataContext.Table.InsertOnSubmit(t);
        dataContext.SaveChanges();
        scope.Complete();
    }
}
于 2012-08-22T07:37:41.567 に答える
0

SQL ストアド プロシージャの使用

SQLサーバーでこれを行う方法を提案できます。SQL ストアド プロシージャを使用します。リンクを使用すると、コントロールが何度も実行されるという欠点があります。

ストアド プロシージャを使用する場合は、これを試してください

DECLARE @sno INT
IF((SELECT MAX(version) FROM Tbl) IS NULL)
SET @sno=0;
ELSE SET @sno=(SELECT MAX(version) FROM Tbl)

INSERT INTO Tbl (Id,Text,version)
VALUES (@id, @text, @sno)

上記のコードでは、 @sno が使用可能であり、最初に 0 に設定されます。以前のバージョン番号が存在しない場合、バージョンは 0 に設定されます。バージョンが存在する場合は、バージョンが 1 つインクリメントされてから挿入されます。

LINQ の使用

LINQを使用することで、

var maxVer = dc.Logs.Max(s => s.Version);

これにより、最大バージョン番号が得られます。これを使用して、自分のやり方で DB に挿入できます。

于 2012-08-22T07:32:55.847 に答える
0

データベース構造を自由に変更できるので、IDENTITY col を使用しました。

于 2012-08-29T10:43:17.577 に答える