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

首先,您需要将此逻辑包装在事务中;它将锁定表格,您将避免并发问题。之后,您可以选择版本的最大值并将其加一。

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 server 中执行此操作的方法。使用 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 。如果存在任何版本,则版本加一然后插入。

使用 LINQ

通过使用 LINQ,

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

这给出了最大版本号。并使用它,您可以按照自己的方式插入数据库。

于 2012-08-22T07:32:55.847 回答
0

我有权更改数据库结构,所以我只使用了 IDENTITY col。

于 2012-08-29T10:43:17.577 回答