我有一个包含两个表的 MYSQL 数据库,property 和 propertyImages,property 有一个主键(propertyID),它与其他列一起自动递增,propertyImages 有一个外键,它是 propertyID。
当我向属性表中插入数据(如属性名称、位置等)时,用户选择的多个图像被插入到属性图像表中,外键与属性表中最后插入的主键相同。
当我插入数据时,属性表行正确填充没有问题,并且多个选定的第一张图像使用正确的外键输入到 propertyImages 表中,但随后它崩溃并且不保存其余图像或图片路径。
string constr = ConfigurationManager.ConnectionStrings["realestatedbAddConString"].ConnectionString;
using (MySqlConnection con = new MySqlConnection(constr))
{
using (MySqlCommand cmd = new MySqlCommand("INSERT INTO property (PropertyName, PropertyNumBeds, PropertyType, PropertyPrice, PropertyFeatures, PropertyLocation, PropertyInformation, ImageName, ImageMap) VALUES (@PropertyName, @PropertyNumBeds, @PropertyType, @PropertyPrice, @PropertyFeatures, @PropertyLocation, @PropertyInformation, @ImageName, @ImageMap)"))
{
using (MySqlDataAdapter sda = new MySqlDataAdapter())
{
cmd.Parameters.AddWithValue("@PropertyName", PropertyName);
cmd.Parameters.AddWithValue("@PropertyNumBeds", PropertyNumBeds);
cmd.Parameters.AddWithValue("@PropertyPrice", PropertyPrice);
cmd.Parameters.AddWithValue("@PropertyType", PropertyType);
cmd.Parameters.AddWithValue("@PropertyFeatures", PropertyFeatures);
cmd.Parameters.AddWithValue("@PropertyLocation", PropertyLocation);
cmd.Parameters.AddWithValue("@PropertyInformation", PropertyInformation);
string FileName = Path.GetFileName(MainImageUploada.FileName);
MainImageUploada.SaveAs(Server.MapPath("ImagesUploaded/") + FileName);
cmd.Parameters.AddWithValue("@ImageName", FileName);
cmd.Parameters.AddWithValue("@ImageMap", "ImagesUploaded/" + FileName);
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
}
if (ImageUploada.HasFiles)
{
foreach(var file in ImageUploada.PostedFiles)
{
string FileName = Path.GetFileName(ImageUploada.FileName);
ImageUploada.SaveAs(Server.MapPath("ImagesUploaded/") + file.FileName);
using (MySqlConnection con = new MySqlConnection(constr))
{
using (MySqlCommand cmd = new MySqlCommand("INSERT INTO propertyimage(MultipleImageName, MultipleImageMap, PropertyID) VALUES (@MultipleImageName, @MultipleImageMap, LAST_INSERT_ID()); "))
{
using (MySqlDataAdapter sda = new MySqlDataAdapter())
{
cmd.Parameters.AddWithValue("@MultipleImageName", file.FileName);
cmd.Parameters.AddWithValue("@MultipleImageMap", "ImagesUploaded/" + file.FileName);
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
}
}
}
txtName.Text = "";
txtPropFeat.Text = "";
txtPropInfo.Text = "";
txtPropLoc.Text = "";
txtNumBeds.Text = "";
txtPrice.Text = "";
txtPropType.Text = "";
Label1.Visible = true;
Label1.Text = "Property Added to Database Successfully!";
}
这是错误信息: MySql.Data.dll 中出现类型为“MySql.Data.MySqlClient.MySqlException”的异常,但未在用户代码中处理
Additional information: Cannot add or update a child row: a foreign key constraint fails (
realestatedb
.propertyimage
, CONSTRAINTpropertyimage_ibfk_1
FOREIGN KEY (PropertyID
) REFERENCESproperty
(PropertyID
) ON DELETE CASCADE ON UPDATE CASCADE)
编辑:有类似问题的人的工作示例
string PropertyName = txtName.Text;
string PropertyFeatures = txtPropFeat.Text;
string PropertyLocation = txtPropLoc.Text;
string PropertyInformation = txtPropInfo.Text;
string PropertyNumBeds = txtNumBeds.Text;
string PropertyPrice = txtPrice.Text;
string PropertyType = txtPropType.Text;
long InsertedID;
string constr = ConfigurationManager.ConnectionStrings["realestatedbAddConString"].ConnectionString;
using (MySqlConnection con = new MySqlConnection(constr))
{
using (MySqlCommand cmd = new MySqlCommand("INSERT INTO property (PropertyName, PropertyNumBeds, PropertyType, PropertyPrice, PropertyFeatures, PropertyLocation, PropertyInformation, ImageName, ImageMap) VALUES (@PropertyName, @PropertyNumBeds, @PropertyType, @PropertyPrice, @PropertyFeatures, @PropertyLocation, @PropertyInformation, @ImageName, @ImageMap)"))
{
using (MySqlDataAdapter sda = new MySqlDataAdapter())
{
cmd.Parameters.AddWithValue("@PropertyName", PropertyName);
cmd.Parameters.AddWithValue("@PropertyNumBeds", PropertyNumBeds);
cmd.Parameters.AddWithValue("@PropertyPrice", PropertyPrice);
cmd.Parameters.AddWithValue("@PropertyType", PropertyType);
cmd.Parameters.AddWithValue("@PropertyFeatures", PropertyFeatures);
cmd.Parameters.AddWithValue("@PropertyLocation", PropertyLocation);
cmd.Parameters.AddWithValue("@PropertyInformation", PropertyInformation);
string FileName = Path.GetFileName(MainImageUploada.FileName);
MainImageUploada.SaveAs(Server.MapPath("ImagesUploaded/") + FileName);
cmd.Parameters.AddWithValue("@ImageName", FileName);
cmd.Parameters.AddWithValue("@ImageMap", "ImagesUploaded/" + FileName);
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
InsertedID = cmd.LastInsertedId;
con.Close();
}
}
}
if (ImageUploada.HasFiles)
{
foreach(var file in ImageUploada.PostedFiles)
{
string FileName = Path.GetFileName(ImageUploada.FileName);
ImageUploada.SaveAs(Server.MapPath("ImagesUploaded/") + file.FileName);
using (MySqlConnection con = new MySqlConnection(constr))
{
using (MySqlCommand cmd = new MySqlCommand("INSERT INTO propertyimage(MultipleImageName, MultipleImageMap, PropertyID) VALUES (@MultipleImageName, @MultipleImageMap, @InsertedID); "))
{
using (MySqlDataAdapter sda = new MySqlDataAdapter())
{
cmd.Parameters.AddWithValue("@MultipleImageName", file.FileName);
cmd.Parameters.AddWithValue("@MultipleImageMap", "ImagesUploaded/" + file.FileName);
cmd.Parameters.AddWithValue("@InsertedID", InsertedID);
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
}
}
}
最佳答案
你的问题是这一行:
using (MySqlCommand cmd = new MySqlCommand("INSERT INTO propertyimage(MultipleImageName, MultipleImageMap, PropertyID) VALUES (@MultipleImageName, @MultipleImageMap, LAST_INSERT_ID()); "))
这将在第一次插入时起作用,因为 LAST_INSERT_ID
是适当的外键值。
但是在第二个 插入时,LAST_INSERT_ID
现在已更改为您刚刚插入的记录(第一个插入)的 ID 值。
要解决此问题,您需要获取 LAST_INSERT_ID
into a C# variable , 然后将其传递到每个后续 SQL 语句中(即 @ForeignKeyID 而不是 LAST_INSERT_ID
)。
这意味着改变您的第一:
cmd.ExecuteNonQuery();
到:
cmd.ExecuteNonQuery();
insertedID = cmd.LastInsertedId;
其中 insertedID 是您在方法顶部声明的变量(可能是 int
)。
然后您需要更改:
using (MySqlCommand cmd = new MySqlCommand("INSERT INTO propertyimage(MultipleImageName, MultipleImageMap, PropertyID) VALUES (@MultipleImageName, @MultipleImageMap, LAST_INSERT_ID()); "))
{
using (MySqlDataAdapter sda = new MySqlDataAdapter())
{
cmd.Parameters.AddWithValue("@MultipleImageName", file.FileName);
cmd.Parameters.AddWithValue("@MultipleImageMap", "ImagesUploaded/" + file.FileName);
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
到:
using (MySqlCommand cmd = new MySqlCommand("INSERT INTO propertyimage(MultipleImageName, MultipleImageMap, PropertyID) VALUES (@MultipleImageName, @MultipleImageMap, @InsertedID); "))
{
using (MySqlDataAdapter sda = new MySqlDataAdapter())
{
cmd.Parameters.AddWithValue("@MultipleImageName", file.FileName);
cmd.Parameters.AddWithValue("@MultipleImageMap", "ImagesUploaded/" + file.FileName);
cmd.Parameters.AddWithValue("@MultipleImageMap", "ImagesUploaded/" + file.FileName);
cmd.Parameters.AddWithValue("@InsertedID", InsertedID);
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
关于c# - 如何使用引用单个主键的外键将多个图像插入到 MySQL 数据库表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45012459/