簡體   English   中英

ASP.NET C#-插入復合鍵

[英]ASP.NET C# - Insert into compound keys

我正在嘗試在“編輯帳戶”頁面上執行更新和插入命令,以便用戶可以編輯其信息。 用戶登錄后,他們將被重定向到“我的帳戶”頁面,該頁面將顯示其所有信息。

我的編輯帳戶頁面如下所示:

修改帳戶頁面圖片

編輯帳戶頁面將訪問數據/將數據插入3個表中:

  1. 會員

    創建表[dbo]。[成員]
    ([[MemberID] INT IDENTITY(1、1)非空,
    [MemberName] VARCHAR(30)NOT NULL,
    [Phone] BIGINT NOT NULL,
    [電子郵件] VARCHAR(50)非空,
    [用戶名] VARCHAR(50)非空,
    [密碼] NCHAR(30)非空,
    聚集的主鍵([MemberID] ASC));

  2. 地址

    創建表[dbo]。[地址]
    ([AddressID] INT IDENTITY(1、1)非空,
    [HouseNumber] VARCHAR(10)NOT NULL,
    [AddressLine1] VARCHAR(30)NOT NULL,
    [AddressLine2] NCHAR(30)NOT NULL,
    [城市] NCHAR(20)非空,
    [PostCode] NCHAR(7)NOT NULL,
    [AddressType] NVARCHAR(MAX)NOT NULL,
    主鍵群集([AddressID] ASC));

  3. 地址_會員

    創建表[dbo]。[Address_Member]
    ([MemberID] INT NOT NULL,
    [AddressID] INT NOT NULL,
    聚集了主鍵([成員ID] ASC,[地址ID] ASC),
    CONSTRAINT [FK_Address_Member_Address] FOREIGN KEY([AddressID])參考[dbo]。[Address]([AddressID]),CONSTRAINT [FK_Address_Member_Member] FOREIGN KEY([MemberID])參考[dbo]。[Member]([MemberID]))) ;

以下是editaccount.aspx.cs中的代碼:

public partial class EditAccount : System.Web.UI.Page
{
    public SqlConnection conn = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True");

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            SqlCommand com;
            string str;

            conn.Open();
            str = "SELECT Address.HouseNumber, Address.AddressLine1, Address.AddressLine2, Address.City, Address.PostCode, Address.AddressType, Address_Member.MemberID, Address_Member.AddressID, Member.MemberName, Member.Phone, Member.Email, Member.Username FROM Address INNER JOIN Address_Member ON Address.AddressID = Address_Member.AddressID RIGHT JOIN Member ON Address_Member.MemberID = Member.MemberID WHERE Member.Email = '" + Session["Email"] + "'";
            com = new SqlCommand(str, conn);
            SqlDataReader reader = com.ExecuteReader();

            if (reader.Read())
            {

                TxtEName.Text = reader["MemberName"].ToString();
                LblEUser.Text = reader["Username"].ToString();
                TxtEEmail.Text = reader["Email"].ToString();
                TxtEPhone.Text = reader["Phone"].ToString();
                TxtEType.Text = reader["AddressType"].ToString();
                TxtEHouse.Text = reader["HouseNumber"].ToString();
                TxtEA1.Text = reader["AddressLine1"].ToString();
                TxtEA2.Text = reader["AddressLine2"].ToString();
                TxtECity.Text = reader["City"].ToString();
                TxtEPostcode.Text = reader["PostCode"].ToString();

                reader.Close();
                conn.Close();
            }
        }

    }

    protected void BtnSave_Click(object sender, EventArgs e)
    {
        SqlDataAdapter adapter;

        DataTable dt = new DataTable();
        DataTable dadt = new DataTable();
        DataTable da = new DataTable();



        try
        {
            conn.Open();
            string query = "SELECT Address.HouseNumber, Address.AddressLine1, Address.AddressLine2, Address.City, Address.PostCode, Address.AddressType, Address_Member.MemberID, Address_Member.AddressID, Member.MemberName, Member.Phone, Member.Email, Member.Username FROM Address INNER JOIN Address_Member ON Address.AddressID = Address_Member.AddressID INNER JOIN Member ON Address_Member.MemberID = Member.MemberID WHERE Member.Email = '" + Session["Email"] + "'";
            SqlCommand cmd = new SqlCommand(query, conn);

            adapter = new SqlDataAdapter(cmd);
            adapter.Fill(dt);
            adapter.Fill(dadt);
            adapter.Fill(da);



            if (dt.Rows.Count > 0)
            {
                string membercmd = "UPDATE Member SET MemberName=@MemberName,Email=@Email,Phone=@Phone";
                SqlCommand Member = new SqlCommand(membercmd, conn);

                Member.Parameters.AddWithValue("@MemberName", TxtEName.Text);
                Member.Parameters.AddWithValue("@Email", TxtEEmail.Text);
                Member.Parameters.AddWithValue("@Phone", TxtEPhone.Text);
                Member.ExecuteNonQuery();

            }

            if (da.Rows.Count > 0)
            {
                string Addresscmd = "UPDATE Address SET HouseNumber ='" + TxtEHouse.Text + "', AddressLine1 = '" + TxtEA1.Text + "', AddressLine2 = '" + TxtEA2.Text + "', City = '" + TxtECity.Text + "',PostCode = '" + TxtEPostcode.Text + "', AddressType = '" + TxtEType.Text + "'";
                SqlCommand Address = new SqlCommand(Addresscmd, conn);
                Address.ExecuteNonQuery();

            }
            else
            {

                string AddressInsert = "INSERT INTO Address (HouseNumber, AddressLine1, AddressLine2, City, Postcode, AddressType) VALUES (@HouseNumber, @AddressLine1, @AddressLine2, @City, @Postcode, @AddressType)";
                SqlCommand Address1 = new SqlCommand(AddressInsert, conn);
                Address1.Parameters.AddWithValue("@HouseNumber", TxtEHouse.Text);
                Address1.Parameters.AddWithValue("@AddressLine1", TxtEA1.Text);
                Address1.Parameters.AddWithValue("@AddressLine2", TxtEA2.Text);
                Address1.Parameters.AddWithValue("@City", TxtECity.Text);
                Address1.Parameters.AddWithValue("@Postcode", TxtEPostcode.Text);
                Address1.Parameters.AddWithValue("@AddressType", TxtEType.Text);
                Address1.ExecuteNonQuery();

                string AddressMember = "INSERT INTO Address_Member (AddressID,MemberID) VALUES (@AddressID,@MemberID)";
                SqlCommand Address_Member = new SqlCommand(AddressMember, conn);
                Address_Member.ExecuteNonQuery();
            }


                conn.Close();
                Response.Write("<script>alert('Changes saved')</script>");
                Response.Redirect("~/MyAccount.aspx");


        }



        catch (Exception ex)
        {
            Response.Write("<script>alert('Changes not saved')</script>" + ex);
            conn.Close();
        }

    }
}

當我執行插入命令時,會插入新數據,但是我不知道如何將ID插入到Address_Member表中,信息在表中彼此鏈接,最終顯示在我的帳戶頁面上。

我也收到此錯誤:System.Data.SqlClient.SqlException(0x80131904):必須聲明標量變量“ @AddressID”

由於未將@AddressID指定為Address_Member的參數,因此會出現錯誤。

如果將名為@AddressID的參數添加到Address_Member並為其提供有效的值,則該錯誤應得到解決。

string AddressInsert = "INSERT INTO Address (HouseNumber, AddressLine1, AddressLine2, City, Postcode, AddressType) VALUES (@HouseNumber, @AddressLine1, @AddressLine2, @City, @Postcode, @AddressType)";
SqlCommand Address1 = new SqlCommand(AddressInsert, conn);
Address1.Parameters.AddWithValue("@HouseNumber", TxtEHouse.Text);
Address1.Parameters.AddWithValue("@AddressLine1", TxtEA1.Text);
Address1.Parameters.AddWithValue("@AddressLine2", TxtEA2.Text);
Address1.Parameters.AddWithValue("@City", TxtECity.Text);
Address1.Parameters.AddWithValue("@Postcode", TxtEPostcode.Text);
Address1.Parameters.AddWithValue("@AddressType", TxtEType.Text);
Address1.ExecuteNonQuery();

string AddressMember = "INSERT INTO Address_Member (AddressID,MemberID) VALUES (@AddressID,@MemberID)";
SqlCommand Address_Member = new SqlCommand(AddressMember, conn);
Address_Member.ExecuteNonQuery();

改成

string AddressInsert = @"
    INSERT INTO Address (HouseNumber, AddressLine1, AddressLine2, City, Postcode, AddressType) 
    VALUES (@HouseNumber, @AddressLine1, @AddressLine2, @City, @Postcode, @AddressType);

    declare @AddressID numeric(38,0)= (select SCOPE_IDENTITY()); -- if your column type is different , deal SCOPE_IDENTITY type should be same with your column

    INSERT INTO Address_Member (AddressID,MemberID) VALUES (
    @AddressID,@MemberID )
";
SqlCommand Address1 = new SqlCommand(AddressInsert, conn);
//new (get MemberID)
Address1.Parameters.AddWithValue("@MemberID", dt.Select().SingleOrDefault()["MemberID"]);
//old
Address1.Parameters.AddWithValue("@HouseNumber", TxtEHouse.Text);
Address1.Parameters.AddWithValue("@AddressLine1", TxtEA1.Text);
Address1.Parameters.AddWithValue("@AddressLine2", TxtEA2.Text);
Address1.Parameters.AddWithValue("@City", TxtECity.Text);
Address1.Parameters.AddWithValue("@Postcode", TxtEPostcode.Text);
Address1.Parameters.AddWithValue("@AddressType", TxtEType.Text);
Address1.ExecuteNonQuery();

希望對您有所幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM