【问题标题】:Insert multiple data into two tables and need to insert the last inserted id into another table将多条数据插入到两个表中,需要将最后插入的id插入到另一个表中
【发布时间】:2017-01-20 01:52:42
【问题描述】:

我有一个表格,它使用两个表格来插入数据。

表单中的某些列会像:

scholarship name, course, year

涉及的两个表是:

scholarshipDetail , scholarshipCourse.
  • scholarshipDetail 表有奖学金名和年份
  • scholarshipCourse 表有奖学金ID,课程

奖学金详情:

schid      schName     year
-----------------------------
1          star         2015
2          moon         2016

奖学金课程:

schID    course
------------------
1        maths
1        english
2        maths

假设新用户想要添加新的奖学金,这意味着 id 将为 3 并插入到两个表中。我该怎么做? (管理插入 ALR)

新错误: 已编辑

public DataTable test(string name, string course)
{
    string insertsql = "INSERT INTO Table1(schName) OUTPUT INSERTED.addID  values (@schName)";

    SqlCommand cmd = new SqlCommand(insertsql,conn);

    cmd.Parameters.AddWithValue("@schName", name);

    conn.Open();
    int i = cmd.ExecuteNonQuery();

    var table1Id = (int)cmd.ExecuteScalar();

    string insertsql1 = "INSERT INTO Table2(ScholarshipID, DiplomaCourse) VALUES (@id, @course)";

    SqlCommand cmd2 = new SqlCommand(insertsql1, conn);
    cmd2.Parameters.AddWithValue("@id", table1Id);
    cmd2.Parameters.AddWithValue("@course", course);

    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = cmd;

    da.SelectCommand = cmd2;
    DataTable dt = new DataTable();
    da.Fill(dt);

    return dt;
}

我表中的输出是

表1

schID     schname
-------------------
1            jj
2            jj

表2

TableID     schID       Course
------------------------------
1            2          Maths

数据在 Table1 中被插入两次。为什么呢? (已解决)

已编辑:

现在的问题是,会有复选框允许用户选择适用于奖学金的课程。

当用户点击所有复选框时,只有最后一个复选框会插入数据库。

在我的代码隐藏(cs)中:

protected void Button1_Click(object sender, EventArgs e)
{
      //  addScholarship[] test = new addScholarship[1];

        string course = "";
        string Name = schName.Text;

        if (DIT.Checked )
        {
            course = "DIT";
        }

        if (DFI.Checked)
        {
            course = "DFI";
        }

        addScholarship[] insertName = new addScholarship[1];
        addScholarship insertedName = new addScholarship(Name,course);

        scholarshipBLL obj = new scholarshipBLL();
        DataTable dt = obj.test(Name, course);
}

【问题讨论】:

  • 假设新用户想要添加新的奖学金,这意味着 id 为 3 并插入到两个表中 - 你的 scholarshipDetail 表是否有 auto_increment 属性?如果是这样,您的插入将始终为新行条目的 ID 提供 +1。这样,您可能希望使用mysqli_insert_idan example 检索该 ID。但是,如果两个人实际使用该系统会怎样——该答案属于数据库事务。
  • 是的,它确实具有自动增量功能。所以每次添加新奖学金时,schID 实际上是一个自动增量。问题是我如何在我的奖学金课程表中插入新的 ID。至于现在我可以插入两个表。但我在奖学金课程中的 schID 为 NULL
  • 我正在使用 asp.net fyi :)
  • 啊对不起@skylight,好吧..我认为你最好使用实体框架而不是简单的查询,虽然there is an example to retrieve last id,但我自己从未尝试过。
  • 如何将选中的复选框值从 UI 传递到后面的代码?使用所有选中的复选框值的逻辑是什么?

标签: c# asp.net


【解决方案1】:

对于您发布的最新问题。 在所有 if 块之后,您只调用一次 obj.test 方法。

因此,“course”变量将具有来自条件为真的最新 if 块的值。

你需要调用 DataTable dt = obj.test(Name, course);每个 if 块中的方法。这意味着如果选中复选框,您将调用插入行。如果未选中,则不插入该行。 以下是您应该放入 button_click 的代码。

string course = "";
string Name = schName.Text;
scholarshipBLL obj = new scholarshipBLL();

List<addScholarship> addScholarshipList= new List<addScholarship>();

addScholarship scholarship;
if (DIT.Checked )
{
    scholarship = new addScholarship(Name,course);
    addScholarshipList.Add(insertedName);
    course = "DIT";
    DataTable dt = obj.test(Name, course);

}

if (DFI.Checked)
{
    scholarship = new addScholarship(Name,course);
    addScholarshipList.Add(insertedName);
    course = "DFI";
    DataTable dt = obj.test(Name, course);

}

【讨论】:

  • 您好,感谢您的帮助。现在在我的数据库中,它给了我空。不为空,也没有价值。可能是什么原因? @ChetanRanpariya
  • 根据您的回答:有两个 insertName。我相信 addScholarship 的 insertName 应该是 insertName?
  • 抱歉.. 代码中存在小问题。但是从代码中可以清楚地看出,在调用 obj.Test 方法后,课程变量被赋予了实际值,这就是为什么它在您的数据库中变为空白的原因。不知道你怎么不能把它捡起来。
  • 关于变量名问题。我用有意义的变量名称更正了代码。重新迭代:您报告的两个问题都是由于代码中的逻辑问题造成的。因此,请尝试调试代码并了解行为的逻辑和原因并解决它,然后再在线寻找答案。这将为您和其他人节省大量时间。
  • 是的,我明白为什么它被插入为空,因为我已经声明了变量。现在它已成功添加到复选框中。但我面临另一个问题。当我点击两个复选框时,我仍然无法将两个课程都插入我的数据库。 @ChetanRanpariya
【解决方案2】:

您正在执行该命令两次。

int i = cmd.ExecuteNonQuery();

var table1Id = (int)cmd.ExecuteScalar();

您只需要执行一个。我认为删除 cmd.ExecuteNoteQuery 可以解决您的问题。

【讨论】:

    【解决方案3】:
    BEGIN;
    
      INSERT INTO scholarshipDetail(schid,schName,year)  VALUES(3,'sun',2017);
    
      INSERT INTO scholarshipCourse(schID,course) VALUES(LAST_INSERT_ID(),'science');
    
    COMMIT;
    

    【讨论】:

    • 确保奖学金中的 schid 是 auto_increment
    • 您好,请看一下上面的问题。我已经编辑过,它设法插入了最后一个 id。但是,在我的数据库中它插入了两次。例如将在上面解释@sarawanakumar
    • 你的代码没有问题,我假设公共 DataTable 测试运行了 2 次,尝试调试
    • 虽然这段代码可能会解决问题,但应始终考虑为其添加解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多