繁体   English   中英

使用ASP和C#从主键填充外键

[英]fill foreign key from primary key using asp and C#

我正在使用c#在asp.net中编写课程和打包表格,这是我的新手。执行任务时,我面临的问题是将所选项目的外键插入数据库,因此我制作了三个包含Id (pk)的表coursesCourse-namePkg-code包含Id (pk), Pkg-name ,最后一个表是Pkg ,其中包含Pkg-id (fk),引用Pkg-Code(Id)Course-Id (fk)引用Courses(Id)

现在我需要做的是,当我从下拉菜单中选择程序包,并从Web应用程序的复选框中选择“课程”时,所选项目的ID将通过外键插入到第三张表Pkg ,现在我面临的问题是执行它时错误正在生成,无法在Course-Id插入NULL值,我的存储过程在执行它时将其插入了第三个表pkg中的值,并且工作正常,我想在数据库中建立一对多关系,我已经搜索了很多但找不到所需的答案请帮忙

<div>
  Select Pkg:  <asp:DropDownList ID ="drop1" runat="server">
               </asp:DropDownList>
</div>
<div style="text-align:center">
    <asp:CheckBoxList ID ="check1" runat="server">
    </asp:CheckBoxList>
</div>
<div>
    <asp:Button ID="Button1" runat="server" Text="Save" OnClick="Button1_Click" />
</div>

码:

protected void Page_Load(object sender, EventArgs e)
{
    string constr = ConfigurationManager.ConnectionStrings["Db"].ConnectionString;

    SqlConnection conn = new SqlConnection(constr);
    conn.Open();

    SqlCommand cmd = new SqlCommand("Select * from PKgCode ", conn);
    SqlDataAdapter data = new SqlDataAdapter(cmd);

    DataSet da = new DataSet();

    data.Fill(da);

    drop1.DataSource = da;

    //drop1.DataValueField = "PkgName";
    drop1.DataTextField = "PkgName";
    drop1.DataValueField="Id";

    drop1.DataBind();

    conn.Close();

    conn.Open();

    SqlCommand cmdd = new SqlCommand("Select * from Courses ", conn);

    SqlDataAdapter daa = new SqlDataAdapter(cmdd);

    DataSet ss = new DataSet();

    daa.Fill(ss);

    check1.DataSource = ss;
    check1.DataTextField = "CourseName";
    check1.DataValueField = "Id";
    check1.DataBind();

    conn.Close();
}

protected void Button1_Click(object sender, EventArgs e)
{
     string constr = ConfigurationManager.ConnectionStrings["Db"].ConnectionString;
     SqlConnection con = new SqlConnection(constr);

     SqlCommand cmm = new SqlCommand("Pkc", con);
     //SqlCommand cm = new SqlCommand("PkI", con);
     cmm.CommandType = CommandType.StoredProcedure;
     //  cm.CommandType = CommandType.StoredProcedure;
     cmm.Parameters.Add("@pname", SqlDbType.NVarChar, 50).Value = drop1.SelectedValue;
     cmm.Parameters.Add("@course", SqlDbType.NVarChar, 50).Value = check1.SelectedValue;

     con.Open();
     cmm.ExecuteNonQuery();
     con.Close();
}

您的存储过程中未列出的代码是什么?

但是,通过查看Button1_Click代码,我很惊讶您将参数值作为NVarChar传递给存储过程。 通常,表的主键和外键将是整数,有时甚至是GIUD。

您需要做的第一件事是验证您从drop1和check11控件返回的内容。 您应该在代码行上放置一个断点,将值分配给参数。 执行中断时,检查每个控件返回的值。 如果它们没有返回有效值,则在page_load事件中的代码中检查绑定到下拉控件的数据。

如果返回的值有效,则错误出在您的存储过程或要在其中存储数据的表中。表中的外键值与其他两个表中的主键值具有相同的数据类型吗? ? 您的存储过程中是否存在编码错误?

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM