我想将一些数据从许多PC保存到一个表中。但是数据有一个手动填充的索引(ID)和先前数据(ID)的顺序,所以我先在数据库上检查它然后递增它。问题是如果多个PC /设备一起保存,它将保存相同结果。如何解决这个问题?
这是查询使用的最后一个ID:
> public DataRow GetPlayerIDByClient(object clientPK)
> {
> DataRow result = null;
>
> if (clientPK != null)
> {
> IDbDataParameter clientFKParam = this.CreateParameter(csPlayerNamesEntity.Names.ClientFK, clientPK);
>
> string selectCommand = string.Format("SELECT TOP 1 * FROM {0} WHERE {1} = {3} AND " +
> "({2} LIKE 'G%' or {2} LIKE 'g%') ORDER BY {4} DESC",
> csPlayerNamesEntity.Names.TableName, //0
> csPlayerNamesEntity.Names.ClientFK, //1
> csPlayerNamesEntity.Names.ID,//2
> clientFKParam,//3
> csPlayerNamesEntity.Names.PK); //4
>
> DataTable dt = this.ExecReaderDataTable(selectCommand, clientFKParam);
>
> if (dt != null && dt.Rows.Count > 0)
> {
> result = dt.Rows[0];
> }
> }
>
> return result;
> }
答案 0 :(得分:0)
如果您有从多个来源更新的表,并且您需要确保正确设置ID,则有两种相当常见的解决方案。
一种方法是使主键成为一个标识列,该列在SQL Server本身上递增。如果您在SQL Server中需要此值,则可以在最后使用SELECT SCOPE_IDENTITY()构造INSERT SQL,以便将Id返回给您的应用程序。插入内容的两个程序/机器将由SQL Server编组,您将不会获得重叠的ID。
另一种方法是使列成为UNIQUEIDENTIFIER并从您的应用程序提供Guid。由于它们是独特的,无论来源如何,它们不同的机器/过程都不会发生冲突。但是,对于大型表可能存在性能损失,因为Ids不会是顺序的,并且它将对表进行分段,因为SQL Server必须在插入时对行进行随机排列,以便以正确的顺序为行腾出空间。