C# 检查主键分配
我有一个web应用程序,它可以写入多个数据库以跟踪员工变更请求。我在输入新员工时遇到问题。首先将其写入主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
员工
数据库,然后再将其访问信息写入以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()-上面的行将返回插入该表的最后一个标识值,而不管作用域/会话如何。如果你同时运行你的程序两次,你将在某个时候进入比赛状态。