【问题标题】:Same ID with different value inserted into database插入数据库的相同 ID 不同值
【发布时间】:2017-06-03 15:03:38
【问题描述】:

我想将具有不同值的相同 id 插入数据库。基本上,它是一种允许用户添加具有某些标准的新奖学金的形式。并非所有奖学金都适用于所有课程。因此将有两个表,scholarship 将获得新的奖学金,scholarshipCourse 将处理课程的资格。

我想同时插入两个数据。当用户按下提交时,scholarship 表中的奖学金 ID 将自动递增,而 scholarshipcourse 表将采用新的奖学金 ID 并插入

例如:

scholashipCourse

scholarship_id    course
-------------------------
    1             math
    1             english
    2             english
    2             science

scholarship:

scholarship_id     scholarshipName 
--------------------------------------
      1            moon scholarship
      2            star scholarship
      3            light scholarship

假设 Scholarship_id 3 是新添加的奖学金,我如何获取该 id 并同时插入到奖学金课程表中。

我可以使用这个选择语句:

INSERT INTO user (name) 
VALUES ('John Smith');

INSERT INTO user_details (id, weight, height)
VALUES (SELECT(id FROM user WHERE name = 'John Smith'), 83, 185); 

但是如何获取刚刚添加的最新 id?

我需要像这样插入到我的 DAL 中:

公共数据表测试(字符串名称,字符串课程) {

        SqlCommand cmd = new SqlCommand();
        SqlConnection myConnection = new SqlConnection(strConnectionString);

        cmd.Connection = conn;
        cmd.CommandText = "INSERT INTO Table1(schName)  values (@schName)";
        cmd.Parameters.AddWithValue("@schName", name);
        conn.Open();
        int i = cmd.ExecuteNonQuery();
        int id = (int)cmd.ExecuteScalar();

        cmd.CommandText = "Select SCOPE_IDENTITY();INSERT INTO Table2(ScholarshipID,DiplomaCourse) values (@id,@course)";
        cmd.Parameters.AddWithValue("@id", id);
        cmd.Parameters.AddWithValue("@course", course);


        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = cmd;
        DataTable dt = new DataTable();
        da.Fill(dt);
        return dt;

    }

已成功添加到两个表中,但它没有检索到最后一个id并插入到表中

【问题讨论】:

  • 你不——你不能同时做——将它插入奖学金表并获取id然后将其插入课程表。
  • 所以在插入新添加的奖学金之后,我检索 id 并插入到课程表中?

标签: c# asp.net


【解决方案1】:

SCOPE_IDENTITY 是一个可能的解决方案。

SCOPE_IDENTITY的描述:https://msdn.microsoft.com/en-us/library/ms190315.aspx

基本上,您插入奖学金表并获取 id(使用 SCOPE_IDENTITY)。然后,使用该 ID,您插入到 ScholarshipCourse 表中。像这样的东西(基于你的奖学金表名称):

DECLARE @id INT
INSERT INTO scholarshipCourse (course) VALUES ('humanities')
SELECT @id = SCOPE_IDENTITY() --RETRIEVES THE LAST INSERTED ID IN THIS SCOPE
INSERT INTO scholarship (scholarship_id, scholarshipName) VALUES (@id, 'star scholarship')

【讨论】:

  • 我之前有 nvr 尝试使用 scope_identity。这对我来说是新事物。还有其他方法吗?
  • SCOPE_IDENTITY 是相当标准和推荐的。 @@IDENTITY 也是一种可能,但建议使用 SCOPE_IDENTITY。
  • 我看到你已经更新了这个问题。我在答案中添加了一些可能的示例代码。
  • 我想我想反过来。所以我认为我应该先插入奖学金,然后获取该奖学金的 id 并插入奖学金课程。该代码有效还是我需要重新排列代码?
  • 我已经使用 sql 查询进行了测试,它完全按照我想要的方式成功插入到 db 中。但我还没有尝试在我的 DAL 中进行测试,看看它是否有效。无论如何,感谢您的帮助。如果我有错误以正确的方式执行它,我会回来
【解决方案2】:

您可以使用OUTPUT 子句来捕获新插入的记录的值,包括标识值:

INSERT INTO user (name)
OUTPUT INSERTED.ID
VALUES ('John Smith');

INSERT 语句将生成一个结果集,其中包含每个插入记录的 ID(在上述情况下,为单行)。您可以像执行查询一样执行命令(例如,如果插入单行,则使用 SqlCommand.ExecuteScalar)。

【讨论】:

    【解决方案3】:

    只需将您的内联选择语句替换为 scope_identity 函数即可。

    INSERT INTO user (name) VALUES ('John Smith');
    INSERT INTO user_details (id, weight, height) VALUES (scope_identity(), 83, 185);
    

    如果您想插入多个详细信息行 您可以声明一个变量并将其值设置为 scope_identity

    INSERT INTO user (name) VALUES ('John Smith');
    declare @id int
    select @id=scope_identity()
    INSERT INTO user (name) VALUES ('John Smith');
    INSERT INTO user_details (id, weight, height) VALUES (@id, 83, 185);
    INSERT INTO user_details (id, weight, height) VALUES (@id, 84, 186);
    

    【讨论】:

    • 为什么用户表在这里?用户表和用户详细信息与此问题无关 - 看起来您复制了另一个问题的答案,甚至没有编辑它。
    • 请先阅读完整的问题,看看他放在底部的例子!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多