我有一个winforms应用程序,其中包含以下类方法:
public aSqlQuery(SqlCommand pSqlCom, string pMode = "object", bool pGetID = false)
{
try
{
string strConnection = aSystem.ConnectionString;
SqlConnection linkToDB = new SqlConnection(strConnection);
pSqlCom.Connection = linkToDB;
switch (pMode)
{
case "non query":
{
linkToDB.Open();
pSqlCom.ExecuteNonQuery();
if (pGetID == true)
{
SqlCommand sqlCom = new SqlCommand("SELECT @@IDENTITY;", linkToDB);
this.LastID = (int)sqlCom.ExecuteScalar();
}
linkToDB.Close();
}
break;
加上其他开关
pSqlCom(SqlCommand)执行得很好,因为我可以看到写入数据库的数据。但是,随后的“SELECT @@ IDENTITY”语句会产生无效的强制转换错误 我做错了什么以及如何在类方法中检索SQL创建的新ID?
答案 0 :(得分:1)
插入行并获取SCOPE_IDENTIY()
给出的ID,不要使用@@IDENTITY
。
您需要在SCOPE_IDENTITY()
之后的同一连接和范围内使用INSERT
。
在您的示例中,您的连接上没有执行 INSERT
,因此您无法获得上次生成的ID。
在您的示例中,pSqlCom
执行INSERT
并不明确,如果没有任何缩进功能将返回NULL
无法转换为int
修改
您希望使用SCOPE_IDENTITY()
,并且希望在与Command
相同的INSERT
内进行此操作。
所以,你的陈述应该像是
var sql =
@"INSERT <Your Data> <Your Table>;
SELECT SCOPE_IDENTIY();"
using (SqlConnection connection = new SqlConnection(strConnection))
{
using (SqlCommand command = new SqlCommand(sql, connection))
{
connection.Open();
object result = command.ExecuteScalar();
}
}
int? id = (int?)(!Convert.IsDBNull(result) ? result : null);
答案 1 :(得分:-1)
它的正确答案是SELECT SCOPE_IDENTITY()语句必须与之前的INSERT语句形成相同的SqlCommand的一部分,但是我在之前的SqlCommand'pSqlCom'中包含了它。一旦SELECT SCOPE_IDENTITY()作为pSqlCom的一部分被包含,代码就正确地返回了Identity。
答案 2 :(得分:-2)
您对该命令的调用应返回非标量类型的内容。实际上你需要使用Int32。 MSDN上的Chek ExecuteScalar。
另外,我建议您使用SCOPE_IDENTITY()
代替@@Identity
。查看following link以获取详细说明。