C# 在中间删除记录后,有没有办法将我的Access表字段重新与C重命名?

C# 在中间删除记录后,有没有办法将我的Access表字段重新与C重命名?,c#,winforms,C#,Winforms,我正在为餐馆创建POS应用程序。在我的应用程序中,每个食品类别都有自己的ID号,我在应用程序中使用这些ID号进行多种用途。当我删除一个类别时,我希望所有类别ID都从1重新编号 例如: 我有5个食物类别,它们的ID从1到5。当我删除3号时,我希望所有的IDS都像这样:1,2,3,4,我不希望中间有任何数字丢失,比如:1,2,4,5,这会影响到我的应用程序的另一部分。 有关更多信息,Access表中的ID字段不是一个自动编号,而是一个数字,每当使用应用程序本身添加新类别时,我都使用c来增加数字 我尝

我正在为餐馆创建POS应用程序。在我的应用程序中,每个食品类别都有自己的ID号,我在应用程序中使用这些ID号进行多种用途。当我删除一个类别时,我希望所有类别ID都从1重新编号

例如: 我有5个食物类别,它们的ID从1到5。当我删除3号时,我希望所有的IDS都像这样:1,2,3,4,我不希望中间有任何数字丢失,比如:1,2,4,5,这会影响到我的应用程序的另一部分。 有关更多信息,Access表中的ID字段不是一个自动编号,而是一个数字,每当使用应用程序本身添加新类别时,我都使用c来增加数字

我尝试了很多方法对ID字段重新编号,比如update语句。 下面是我在删除记录后使用的代码

string CmdTxt = "SELECT COUNT(CategoryId) FROM Categories";
OleDbCommand Command = new OleDbCommand(CmdTxt, Connection);
Connection.Open();
int count = Convert.ToInt32(Command.ExecuteScalar());
Connection.Close();

 int row = 1;   // to specify the row I want to make changes in. 
 int newId = 1;    // to set new Id for each specified row. 

for (int i = 0; i <= count; i++)
{

   // from here the problem starts...

   string CmdTxt1 = "UPDATE Categories ROW"+row+" 
                    SET[CategoryId]=@ParaNewId";


   OleDbCommand Command1 = new OleDbCommand(CmdTxt1, Connection);

   Command1.Parameters.Add("@ParaNewId", newId); 
   // have no problems with parameters. 

   Connection.Open();
   Command11.ExecuteNonQuery();
   Connection.Close();
   row++; 
   newId++; 

}
我试过这个密码。它给了我语法错误。而且,我知道CmdTxt1有一个错误

这里我想问另一个问题:是否有其他方法来指定或选择我要更改的行号?
因为如果我在不指定行的情况下运行此代码,则每次for循环重复时,所有CategoryId列单元格都将具有相同的编号。

正如您在评论中引起的愤怒所示,您不应该这样做。主键ID号唯一标识数据库表中的一行,不应更改。大多数情况下,它们也不应该显示给最终用户,因为您可能希望对外观有更大程度的控制,而且如果用户能够猜到其他ID,则向用户显示您的ID可能会导致他们尝试猜测其他ID,例如更改URL中显示的帐号,以查看他们是否可以闯入其他人的帐户。努力使您的IDs仅在内部使用,并让数据库根据需要对其进行管理

假设你正在开发这个系统,你希望用户能够按1到5作为进入一个类别的快捷键,但是你希望确保数字是连续的。指定您的表格,如:

CategoryID int primary key autonumber
ShortcutKey int not null
CategoryName varchar(or text, or whatever access calls it) not null
在删除类别时,您需要执行以下操作:

conn.Open();
var cmd  = new OleDbCommand("DELETE FROM categories WHERE shortcutkey = ?", conn);
cmd.Parameters.AddWithValue("p1", 3); // remove key 3 - you'll make this variable chosen by the user of course
cmd  = new OleDbCommand("UPDATE categories SET shortcutkey = shortcutkey - 1 WHERE shortcutkey > ?", conn);
cmd.Parameters.AddWithValue("p1", 3); // again, make variable
cmd.ExecuteNonQuery();
conn.Close();
你把你的ID留下,你在更新用户看到的东西。要让数据库删除3并洗牌3以上的所有内容要比计数、循环和调整等更容易


考虑到不使用ID实际上可以帮助回答其他问题。假设一个用户来找你,说现在快捷键的类别不同了,为什么?你看ID值,它们是1,2,4,5,6,而大多数用户从不更改他们的密钥,所以你习惯于看到1,2,3,4,5。。你可以说最近有人删除了第三个,又添加了另一个。或者如果你看到34,78,99120356的身份证号码,你会想哇,这些家伙改变了很多快捷键,让我们联系一下,看看这是否是我们可以改进的一个痛点-用户总是想要解释,没有解释,他们会把自己的错误归咎于计算机系统,这使得支持系统的商业方面非常困难

您是否有其他表,其中包含链接到特定类别ID的记录?如果是这样,并且您更改了ID,那么其中一些/许多记录将不再指向正确的类别。SQL语句看起来有点混乱,但至少在连接之前需要将行转换为字符串row.ToString+updatesometable SET SomeField=@SomeValue,其中SomeField=@SomeIdYou应该重新考虑这一点。ID号应该是数据库使用的键,而不是最终用户。你的问题的答案是肯定的,但我考虑过了。我可以处理它,如果我可以重新编号我的类别ID。是的,我知道我的SQL语句不对。我已经使用了您刚才注释的代码,它给了我重复的值。重新排序Id是一个非常糟糕的主意。首先,Id除了作为唯一标识符外,不应具有任何内在意义或作用。其次,它不是您的Id,DB应该发布它。第三,它是一个关系数据库,因此应该有依赖于该值的东西不会改变。只要说不。第四,你的应用程序正在泄漏——实现IDisposable的东西应该被处理掉。这一点很好。因此,您告诉我不要使用ID,而是在我的表中创建另一个int字段,使用“快捷键”名称或其他名称,并使用该字段而不是ID。好吧,我已经这样做了,您的代码运行良好。这才是我真正想要的。非常感谢你!