从 table 获取 RecordId

Get RecordId from table

我是 SQL 的新手,我有 table 和 RecordId 自动递增并且是主键。我想获取插入到 table 中的行的 RecordId。 在此先感谢您的帮助。

myCommand.CommandText = "INSERT INTO " + tableName + " (DateRaised,RaisedBy,WeekNo,Platform,Department,Site,Process, Area,NavErrorNo,RootCauseDescription,Status) " +
    "VALUES ('" + currentDate.ToString(format) + "','" +
    sender + "'," +
    weekNumber + ",'" +
    comboBoxPlatform.SelectedItem + "','" +
    comboBoxDepartment.SelectedItem + "','" +
    comboBoxSite.SelectedItem + "','" +
    comboBoxProcess.SelectedItem + "','" +
    comboBoxArea.SelectedItem + "','" +
    textBoxNavError.Text + "','" +
    textBoxIssue.Text + "','Open')";
//int lastInsertedId = 
myCommand.ExecuteNonQuery();

lastInsertedId 在我的 table.

中应该是来自 RecordId 的整数

这应该能帮到您

private void SelectLast()
        {

            string sqlLast = "SELECT TOP(1) RecordId FROM [YourtableName] ORDER BY 1 DESC";

            Connection.Open();
            using (SqlCommand cmd = new SqlCommand(sqlLast, Connection))
            {
                cmd.CommandType = CommandType.Text;
                {
                    int insertedID = Convert.ToInt32(cmdAdd.ExecuteScalar());
                    textBoxID.Text = Convert.ToString(insertedID);
                }
                Connection.Close();
            }

        }

首先,从代码调用直接 SQL 语句不是一个好主意,它可能会导致 SQL 注入问题,正如@Zohar 所建议的那样。 您可以使用用户参数化查询或 sp.

在sp里面,可以使用

SELECT @@IDENTITY AS 'Identity';

Insert语句后,会returnPK的最后一个自增值, 然后 return 这个值作为输出参数,并在 C# 代码中的 .ExecuteNonQuery(); 之后捕获它。

正确(如果这是针对SQL服务器 - 你对此不是很清楚) ,我看到两个选项:

方法#1 - 使用SCOPE_IDENTITY

如果您一次只插入一行,这很有效 - 使用类似这样的东西:

// set up your query using *PARAMETERS** as you **ALWAYS** should! 
// Using SELECT SCOPE_IDENTITY() to get back the newly inserted "Id"
myCommand.CommandText = "INSERT INTO dbo.SomeTable (list-of-columns) " +
                        "VALUES (@param1, @param2, @param3, ...., @paramN); " +
                        "SELECT SCOPE_IDENTITY();";

// set up the parameters and theirs values

object result = myCommand.ExecuteScalar();

if (result != null)
{ 
    int lastInsertedId = Convert.ToInt32(result);
}

方法 #2 - 使用 OUTPUT 子句

即使您一次插入多行(通常在 INSERT 之后使用 SELECT),这也能很好地工作:

// set up your query using *PARAMETERS** as you **ALWAYS** should! 
// Using SELECT SCOPE_IDENTITY() to get back the newly inserted "Id"
myCommand.CommandText = "INSERT INTO dbo.SomeTable (list-of-columns) " +
                        "OUTPUT Inserted.RecordId " + 
                        "VALUES (@param1, @param2, @param3, ...., @paramN); ";

// set up the parameters and theirs values

object result = myCommand.ExecuteScalar();

if (result != null)
{ 
    int lastInsertedId = Convert.ToInt32(result);
}