【问题标题】:Update database from 2 tables with c#使用 c# 从 2 个表更新数据库
【发布时间】:2025-11-29 08:40:01
【问题描述】:

phpMyAdminc# 合作。

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

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在第 1 行的 'from bucket inner join color on bucket.color_idcolor = color.idcolor' 附近使用

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# mysql sql .net


    【解决方案1】:

    而是尝试将文本保存在 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();
    

    【讨论】:

    • 这不是错误。但是,有错误。无论我是否更改数据,它都会显示 msgbox:You haven't changed any data
    • 您是否编辑了差异(komen.Parameters 和 comand.Parameters)?
    • 你只能做:conand.ExecuteNonQuery();
    • 你也可以这样做 if(result>0){//你影响了不止一行} else if(result==0){//couldn't find the bucket id} else {/ /不同类型的问题}
    • 我已经做到了。但是,msgbox 仍然出错。您的代码无法将更新存储到数据库
    【解决方案2】:

    你的命令应该是;

    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之前

    【讨论】:

    • 错误:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from bucket where idBucket=NULL' at line 1
    • color=@color.name之后删除, from bucket
    • 错误:Unknown column 'color' in 'field list'
    【解决方案3】:

    一个问题是更新语句中的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);
    

    注意:此函数假定数据库连接已经打开。

    【讨论】:

    • 错误:Unknown column 'color' in 'field list'
    • 因为你在那个表中没有颜色字段,所以你有 color_idcolor
    • @virusivv 对不起,我不明白你的意思
    • 在表桶中没有列:“color”但有列:“color_idcolor”
    • @virusivv 哪种颜色??
    【解决方案4】:
     comand.CommandText = "update bucket set volume=@volume, color=@color.name, from bucket "
        + "inner join color on bucket.color_idcolor = color.idcolor "
        + "where idBucket=@idbucket";
    

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

    【讨论】: