[英]ASP.NET C# - Insert into compound keys
I am trying to perform an update and insert command on 'edit account' page where users can edit their information. 我正在尝试在“编辑帐户”页面上执行更新和插入命令,以便用户可以编辑其信息。 When a user logs in, they will be redirected to a 'My Account' page which will display all their information.
用户登录后,他们将被重定向到“我的帐户”页面,该页面将显示其所有信息。
My edit account page looks like this: 我的编辑帐户页面如下所示:
Edit account page image 修改帐户页面图片
The edit account page will be accessing/inserting data into 3 tables: 编辑帐户页面将访问数据/将数据插入3个表中:
Member 会员
CREATE TABLE [dbo].[Member] 创建表[dbo]。[成员]
( [MemberID] INT IDENTITY (1, 1) NOT NULL, ([[MemberID] INT IDENTITY(1、1)非空,
[MemberName] VARCHAR (30) NOT NULL, [MemberName] VARCHAR(30)NOT NULL,
[Phone] BIGINT NOT NULL, [Phone] BIGINT NOT NULL,
[Email] VARCHAR (50) NOT NULL, [电子邮件] VARCHAR(50)非空,
[Username] VARCHAR (50) NOT NULL, [用户名] VARCHAR(50)非空,
[Password] NCHAR (30) NOT NULL, [密码] NCHAR(30)非空,
PRIMARY KEY CLUSTERED ([MemberID] ASC) ); 聚集的主键([MemberID] ASC));
Address 地址
CREATE TABLE [dbo].[Address] 创建表[dbo]。[地址]
( [AddressID] INT IDENTITY (1, 1) NOT NULL, ([AddressID] INT IDENTITY(1、1)非空,
[HouseNumber] VARCHAR (10) NOT NULL, [HouseNumber] VARCHAR(10)NOT NULL,
[AddressLine1] VARCHAR (30) NOT NULL, [AddressLine1] VARCHAR(30)NOT NULL,
[AddressLine2] NCHAR (30) NOT NULL, [AddressLine2] NCHAR(30)NOT NULL,
[City] NCHAR (20) NOT NULL, [城市] NCHAR(20)非空,
[PostCode] NCHAR (7) NOT NULL, [PostCode] NCHAR(7)NOT NULL,
[AddressType] NVARCHAR (MAX) NOT NULL, [AddressType] NVARCHAR(MAX)NOT NULL,
PRIMARY KEY CLUSTERED ([AddressID] ASC) ); 主键群集([AddressID] ASC));
Address_Member 地址_会员
CREATE TABLE [dbo].[Address_Member] 创建表[dbo]。[Address_Member]
( [MemberID] INT NOT NULL, ([MemberID] INT NOT NULL,
[AddressID] INT NOT NULL, [AddressID] INT NOT NULL,
PRIMARY KEY CLUSTERED ([MemberID] ASC, [AddressID] ASC), 聚集了主键([成员ID] ASC,[地址ID] ASC),
CONSTRAINT [FK_Address_Member_Address] FOREIGN KEY ([AddressID]) REFERENCES [dbo].[Address] ([AddressID]), CONSTRAINT [FK_Address_Member_Member] FOREIGN KEY ([MemberID]) REFERENCES [dbo].[Member] ([MemberID]) ); CONSTRAINT [FK_Address_Member_Address] FOREIGN KEY([AddressID])参考[dbo]。[Address]([AddressID]),CONSTRAINT [FK_Address_Member_Member] FOREIGN KEY([MemberID])参考[dbo]。[Member]([MemberID]))) ;
The following is the code in editaccount.aspx.cs: 以下是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();
}
}
}
When I perform an insert command, new data was inserted but I do not know how to insert the IDs into the Address_Member table where the information are linked with each other and eventually display on my account page. 当我执行插入命令时,会插入新数据,但是我不知道如何将ID插入到Address_Member表中,信息在表中彼此链接,最终显示在我的帐户页面上。
I also got this error: System.Data.SqlClient.SqlException (0x80131904): Must declare the scalar variable "@AddressID" 我也收到此错误:System.Data.SqlClient.SqlException(0x80131904):必须声明标量变量“ @AddressID”
The error arises because @AddressID is not specified as a parameter for Address_Member. 由于未将@AddressID指定为Address_Member的参数,因此会出现错误。
If you add a parameter called @AddressID to Address_Member and give it a valid value that should fix the error. 如果将名为@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();
change to 改成
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();
hope help you :) 希望对您有所帮助:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.