C# 检查主键分配

C# 检查主键分配,c#,asp.net,sql,C#,Asp.net,Sql,我有一个web应用程序,它可以写入多个数据库以跟踪员工变更请求。我在输入新员工时遇到问题。首先将其写入主员工数据库,然后再将其访问信息写入以EMP_ID为主键的其他数据库。当它写入其他数据库时,EMP\u ID已经生成,因此它被输入为0 为了解决这个问题,我尝试循环并检查EMP\u ID值,直到生成一个值,但是我继续陷入循环,因为查询返回的结果是没有找到值 while (int.Parse(empIDChecker) == 0) { dbConnection.Open(); vali

我有一个web应用程序,它可以写入多个数据库以跟踪员工变更请求。我在输入新员工时遇到问题。首先将其写入主
员工
数据库,然后再将其访问信息写入以
EMP_ID
为主键的其他数据库。当它写入其他数据库时,
EMP\u ID
已经生成,因此它被输入为0

为了解决这个问题,我尝试循环并检查
EMP\u ID
值,直到生成一个值,但是我继续陷入循环,因为查询返回的结果是没有找到值

while (int.Parse(empIDChecker) == 0)
{
   dbConnection.Open();
   validateIDSQLString = "SELECT EMP_ID FROM EMPLOYEE_TABLE WHERE FIRST_NAME = '" +        firstNameTextBox.Text.Trim() + "' AND LAST_NAME = '" + lastNameTextBox.Text.Trim() + "'";

   SqlCommand updateSQLCmd = new SqlCommand(validateIDSQLString, dbConnection);
   SqlDataReader getRecords = updateSQLCmd.ExecuteReader();

   try
   {
       empIDChecker = getRecords["EMP_ID"].ToString();
   }
   catch
   {
       empIDChecker = "0";
   }

   getRecords.Close();
   dbConnection.Close();
}
你可以用

SELECT IDENT_CURRENT(‘tablename’)
这将为您提供表的最后一个插入的自动增量ID,您可以使用该ID在其他表中插入


同时检查此链接

确定,因此如果插入存储过程类似于:

sp_InsertEmp
...

INSERT INTO Emp(Name, etc...)
VALUES ('Paul', etc...)

SELECT SCOPE_IDENTITY() AS EMP_ID

GO
在您的代码中:

   SqlCommand insertCmd = new SqlCommand("sp_InsertEmp", dbConnection);

   ... Add parameters here and set type to StoredProcedure

   SqlDataReader dr= insertCmd.ExecuteReader();
   int newId;

   if (dr.Read())
   {
     newId = dr.GetInteger(0);
   }

您的EMP_ID是如何生成的?它是自动递增键吗?如果是这样的话,您需要从insert语句中返回它-类似于insert后的SELECT SCOPE_IDENTITY()这样的语句应该可以完成。您还应该了解这一点:您使用的是多个数据库还是多个表。如果它们是多个数据库,那么我认为使用自动增量id不是一个好方法idea@habib.osu对不起,多张桌子。我在那里读错了。@Paddy我如何从查询中接收该值?在实现这段代码时,我不断抛出这样一个错误:“当没有数据存在时,读取的尝试无效。”我不知道为什么。查询字符串是正确的,它返回我在management studio中需要的数据。如果您将问题中的一些代码作为编辑发布,我们可以查看一下。这只是我过度查看简单内容的一个例子。我发布的当前代码中实际上缺少它。我忘了实际读取()数据…如果你看那篇文章,你会发现它建议始终使用SCOPE_IDENTITY()-上面的行将返回插入该表的最后一个标识值,而不管作用域/会话如何。如果你同时运行你的程序两次,你将在某个时候进入比赛状态。