使用c#从2个表更新数据库
本文关键字:更新 数据库 2个 使用 | 更新日期: 2023-09-27 18:27:14
与phpMyAdmin
和c#
一起工作。
我想用c#
更新phpMyAdmin
中的数据库。但是,我有一个错误:
您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以获得在第1行的"来自bucket.color_idcolor=color.idcolor上的bucket内部联接颜色"附近使用的正确语法
在phpMyAdmin
中,我在同一个数据库中有两个表:bucket
和color
。在bucket
表中,我有列:idbucket
、volume
和color_idcolor
。在color
表中,我有列:idcolor
和name
。
在c#
中,我制作了一个windows表单,用户可以在其中更新数据库。他们可以更新volume
(文本框)和color
(组合框),并按"保存"按钮将更新存储到数据库中。这是我代码的几个部分:
private string idBucket;
private string volume;
private string color;
public void TransferData(string idBucket, string volume, string color)
{
this.idBucket = idBucket;
this.volume = volume;
this.color = color;
}
MySqlConnection conector = new MySqlConnection();
public frmChangeBucket()
{
InitializeComponent();
conector.ConnectionString = "server=localhost; database=bucket; uid=root";
}
void ContentCboColor()
{
conector.Open();
MySqlCommand comand = new MySqlCommand();
comand.Connection = conector;
comand.CommandType = CommandType.Text;
comand.CommandText = "select idcolor, name from color";
MySqlDataAdapter da = new MySqlDataAdapter();
DataTable dt = new DataTable();
da.SelectCommand = comand;
da.Fill(dt);
cboColor.DisplayMember = "name";
cboColor.ValueMember = "idcolor";
cboColor.DataSource = dt;
conector.Close();
}
private void btnSave_Click(object sender, EventArgs e)
{
conector.Open();
MySqlCommand comand = new MySqlCommand();
comand.Connection = conector;
comand.CommandType = CommandType.Text;
int result = 0;
volume = txtVolume.Text;
color = cboColor.SelectedValue.ToString();
comand.CommandText = "update bucket set volume=@volume, color=@color.name, from bucket "
+ "inner join color on bucket.color_idcolor = color.idcolor "
+ "where idBucket=@idbucket";
komen.Parameters.AddWithValue("@idbucket", idBucket);
komen.Parameters.AddWithValue("@volume", volume);
komen.Parameters.AddWithValue("@color.name", color);
result += comand.ExecuteNonQuery();
comand.Parameters.Clear();
if (result > 0)
{
MessageBox.Show("You've changed " + result + " data");
}
else
{
MessageBox.Show("You haven't changed any data");
}
conector.Close();
this.Close();
}
在c#
中,我刚刚在组合框中显示了颜色name
。首先,用户可以显示数据库中的一些数据。我使用内部联接来显示颜色name
。要将更新存储到数据库,是否必须再次使用inner join
?请用正确的代码回答。谢谢你的帮助。
而是尝试在int字段(color=@color.name
)中保存文本您应该使用:
"color_idcolor = color.idcolor"
基本上:
comand.CommandText = "update bucket set volume=@volume, color_idcolor=@color.idcolor "
+ "where idBucket=@idbucket";
comand.Parameters.AddWithValue("@idbucket", idBucket);
comand.Parameters.AddWithValue("@volume", volume);
comand.Parameters.AddWithValue("@color.idcolor", color);
result += comand.ExecuteNonQuery();
comand.Parameters.Clear();
您的命令应该是;
comand.CommandText = "update bucket "
+ "inner join color on bucket.color_idcolor = color.idcolor "
+ "set volume=@volume, color_idcolor=@color.idcolor"
+ "where idBucket=@idbucket";
删除color=@color.name
之后的, from bucket
,INNER JOIN
应在UPDATE
之后和SET
之前
一个问题是更新语句中的from bucket
,它需要删除。另一个问题是联接-尝试用子查询替换联接:
update bucket
set volume=@volume,
color_idcolor=@color.idcolor
where idBucket=@idbucket and
bucket.color_idcolor in (select color.idcolor from color)
把这个放到命令文本中,它应该是这样的:
comand.CommandText =
"update bucket " +
"set volume=@volume, " +
" color_idcolor=@color.idcolor " +
"where idBucket=@idbucket " +
"and bucket.color_idcolor in (select color.idcolor from color)";
然后更换
komen.Parameters.AddWithValue("@color.name", color);
发件人:
komen.Parameters.AddWithValue("@color.idcolor", colorId);
最后,由于您有颜色名称而不是颜色id,因此可以通过单独的命令select color.idcolor from color where color.name = @color.name
更早地查找正确的颜色id。
其代码可能如下:
string SelectItem(MySqlConnection conn, string Name)
{
string result="";
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select top 1 color.idcolor from color where color.name = @color.name";
cmd.Parameters.AddWithValue("@color.name", Name);
result=cmd.ExecuteScalar().ToString();
}
return result;
}
使用此功能,您可以获得颜色Id
var colorId = SelectItem(conector, color);
注意:此函数假定数据库连接已打开。
comand.CommandText = "update bucket set volume=@volume, color=@color.name, from bucket "
+ "inner join color on bucket.color_idcolor = color.idcolor "
+ "where idBucket=@idbucket";
在更新中,来自关键字的查询将不会出现,并且更新查询不能使用联接查询。