【问题标题】:Get RecordId from table从表中获取 RecordId
【发布时间】:2019-12-10 21:18:53
【问题描述】:

我是 SQL 新手,我有一个带有 RecordId 的表,它会自动递增并且是主键。我想获得插入到表中的行的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 应该是我表中 RecordId 的整数。

【问题讨论】:

  • 此代码存在安全隐患。阅读有关 SQL 注入和参数化查询的信息。不要使用具有相同结构的多个表(正如表名的串联所暗示的那样)。

标签: c# sql insert command executenonquery


【解决方案1】:

正确(如果这是针对 SQL Server - 您对此不是很清楚),我看到了两个选项:

方法#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);
}

【讨论】:

  • 我将尝试方法 2,设置参数需要一些时间,因为我以前从未这样做过。谢谢@marc_s
【解决方案2】:

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

在sp里面,可以使用

SELECT @@IDENTITY AS 'Identity';

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

【讨论】:

  • 你能把我的代码改成正确的写法吗?
  • 我建议使用 SCOPE_IDENTITY() 而不是其他任何东西(如@@IDENTITY)来获取新插入的标识值。 See this blog post for an explanation as to WHY
  • @marc_s 这是我正在寻找的,但不知道如何将我的代码更改为正确的做法。
  • @PawelG:添加了我自己的回复,显示了这样做的有效方法,恕我直言
【解决方案3】:

这应该对你有用

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();
            }

        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2017-06-09
    • 2020-08-22
    相关资源
    最近更新 更多