使用c#从2个表更新数据库

本文关键字:更新 数据库 2个 使用 | 更新日期: 2023-09-27 18:27:14

phpMyAdminc#一起工作。

我想用c#更新phpMyAdmin中的数据库。但是,我有一个错误:

您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以获得在第1行的"来自bucket.color_idcolor=color.idcolor上的bucket内部联接颜色"附近使用的正确语法

phpMyAdmin中,我在同一个数据库中有两个表:bucketcolor。在bucket表中,我有列:idbucketvolumecolor_idcolor。在color表中,我有列:idcolorname

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?请用正确的代码回答。谢谢你的帮助。

使用c#从2个表更新数据库

而是尝试在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 bucketINNER 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";

在更新中,来自关键字的查询将不会出现,并且更新查询不能使用联接查询。