SQL Server Compact Edition - 序列列?

发布于 2024-11-30 10:13:01 字数 868 浏览 0 评论 0原文

我有一个使用 SQL Server Compact(3.5 并将升级到 4.0)的简单桌面应用程序。

在我的主客户表中,除了 ID 列(即 PK 并且自动递增)之外,我还需要保存一个以某个数字(20000 )并且是独一无二的。

通过现有最高行计算下一个数字的选项不是一个好选择 - 如果其他客户端在我的第一个选择和插入之间添加客户 - 我会遇到问题。

正如 许多 地点, SqlCE自增列应该是Identity列,并且每个表中只能有一个Identity列。

您知道还有其他做法可以解决这个问题吗?

顺便说一句 - 我正在使用 Linq to ADO .net。

编辑:

刚刚找到此链接并发现我什至可以将 Identity 选项与 linq to Entities 框架一起使用: http://erikej.blogspot.com/ 2010/04/解决方案到服务器生成的密钥-and.html

I have a simple desktop application that is using SQL Server Compact (3.5 and about to be upgraded to 4.0).

In my main customers table, in addition to the ID column - which is the PK and is auto incremented, I need to hold a Number column that starts in some number (20000) and is unique.

The option of computing the next number by the existing highest row is not a good one - if other client is adding a customer between my first selection to my inserting - I'll have a problem.

As pointed in many places, SqlCE auto incremented column should be Identity column, and in each table could be only one Identity column.

Is there other practice you know to solve this problem?

BTW - I am using Linq to ADO .net.

Edit:

Just found this link and discovered that I can use even the Identity option with linq to Entities framework:
http://erikej.blogspot.com/2010/04/solutions-to-server-generated-keys-and.html

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

南街九尾狐 2024-12-07 10:13:01

这个动作基本上是错误的
但如果你坚持这样做
当您选择列的最大值时,您需要进行事务。因此,您可以确保其他用户在此操作完成之前无法更新(和更改最大值)。

using (TransactionScope transaction = new TransactionScope())
{         
    // Set new NumericColumn 
    entity.NumericColumn = (db.Context.Rotations.Max(r => (long?)r.NumericColumn ) ?? 20000) + 1;
    // Insert entity
    db.Context.Rotations.AddObject(entity);
    db.Context.SaveChanges();

    transaction.Complete();
}

this action is wrong basically
but if you persist that
you need a transaction when you select max value of your column.so you ensure another user can't update(and change max value) until this action complete.

using (TransactionScope transaction = new TransactionScope())
{         
    // Set new NumericColumn 
    entity.NumericColumn = (db.Context.Rotations.Max(r => (long?)r.NumericColumn ) ?? 20000) + 1;
    // Insert entity
    db.Context.Rotations.AddObject(entity);
    db.Context.SaveChanges();

    transaction.Complete();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文