为什么绑定数据不适用于 C# 中的 union sql 查询?

Why binding data does not work with union sql query in C#?

我有一个 listbox 和一个 union 查询 datasource :

  public partial class FrmCodes : Form
     
{
    SqlConnection Cn = new SqlConnection(@"Server = AMR-PC\SQLEXPRESS ; Database=PlanningDB ; Integrated Security = True");
    SqlDataAdapter da,da2;
    DataTable dt = new DataTable();
    DataTable dt2 = new DataTable();
    CurrencyManager Cm;
    SqlCommandBuilder Cmdb;
    string prm,SlctType;
      
    public FrmCodes()
    {
        InitializeComponent();
        da = new SqlDataAdapter("SELECT Code,Item,Type FROM Items UNION SELECT ProductCode,Product,Family FROM Products", Cn);
        da.Fill(dt);
        DataView dv = new DataView(dt);
        ListItems.DataSource = dv;
        ListItems.DisplayMember = "Item";
       
      
    }

我正在尝试根据 listbox 选择将数据绑定到此表单中的四个文本框,首先我直接尝试了联合查询,但不断收到错误消息“第 x 列不存在 .... “所以我使用了原来的两个查询,像这样分开:

  private void ListItems_Click(object sender, EventArgs e)
        {
            var Slctd = (DataRowView)ListItems.SelectedItem;
            if (Slctd != null)
            {
                prm = Slctd["Code"].ToString();
                SlctType = Slctd["Type"].ToString();
                
              // Try to solve two bindings to the same property error 
                txtcode.DataBindings.Clear();
                txtItem.DataBindings.Clear();
                txtMaterialType.DataBindings.Clear();
                txtFamily.DataBindings.Clear();

                if (SlctType == "Material" || SlctType == "Master" || SlctType == "Packing" || SlctType == "Mix")
                {
                    
                    this.txtMaterialType.Visible = true;
                    this.lblMaterialType.Visible = true;
                    this.txtFamily.Visible = false;
                    this.lblFamily.Visible = false;
                    //this.PgBom.Hide();
                    try
                    {
                        da2 = new SqlDataAdapter("SELECT Code,Item,Type FROM Items WHERE Code LIKE '%prm%' ", Cn);
                        da2.Fill(dt2);

                        txtcode.DataBindings.Add("Text", dt2, "Code");
                        txtItem.DataBindings.Add("Text", dt2, "Item");
                        txtMaterialType.DataBindings.Add("Text", dt2, "Type");

                        Cm = (CurrencyManager)this.BindingContext[dt2];
                    }
                    catch (SqlException Err)
                    {
                        MessageBox.Show("This Error Occured :" + Err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    }

                }
                else
                {
                    // MessageBox.Show("You Chosed : " + prm + " It Is Product ", "Product");
                    this.txtFamily.Visible = true;
                    this.lblFamily.Visible = true;
                    this.txtMaterialType.Visible = false;
                    this.lblMaterialType.Visible = false;
                    try
                    {
                        da2 = new SqlDataAdapter("SELECT ProductCode,Product,Family FROM Products WHERE ProductCode LIKE '%prm%'", Cn);
                        da2.Fill(dt2);
                        txtcode.DataBindings.Add("Text", dt2, "ProductCode");
                        txtItem.DataBindings.Add("Text", dt2, "Product");
                        txtFamily.DataBindings.Add("Text", dt2, "Family");

                        Cm = (CurrencyManager)this.BindingContext[dt2];
                    }
                    catch (SqlException Err)
                    {
                        MessageBox.Show("This Error Occured :" + Err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    }

                }
            }

            else
            {
                prm = "";
            }

            }

但是文本框没有任何反应,没有数据出现在文本框中。 如果出现数据,我需要使用 Currency Manager 进行编辑、添加、删除:

  private void CmdEdit_Click(object sender, EventArgs e)
        {
            try
            {
                Cm.EndCurrentEdit();
                Cmdb = new SqlCommandBuilder(da2);
                da.Update(dt2);
                Cm.Refresh();
                MessageBox.Show("Edited Successfuly", "Done :)", MessageBoxButtons.OK, MessageBoxIcon.Information);
               
            }

            catch (SqlException Err)
            {
                MessageBox.Show("This Error Occured :" + Err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);


            }
        }

抱歉这么久 post ,提前致谢。

编辑 #1:当我尝试将 sql 查询的条件设置为固定值时,它工作正常并且数据编辑也有效。

da2 = new SqlDataAdapter("SELECT ProductCode,Product,Family FROM Products WHERE ProductCode LIKE '10001'", Cn);

但是,如果条件是一个变量值或 Textbox.Text 文本框中什么也不会显示。

编辑 #2:我将引用语法从 LIKE '%prm%' 更改为 LIKE @prm 并添加了此代码:

 da2.SelectCommand.Parameters.AddWithValue("@prm", "%" + Slctd["Code"].ToString() + "%");

而且效果很好。

经过一番研究我明白了,问题是

da2 = new SqlDataAdapter("SELECT Code,Item,Type FROM Items WHERE Code LIKE '%prm%' ", Cn);

我改成:

da2 = new SqlDataAdapter("SELECT Code,Item,Type FROM Items WHERE Code LIKE @prm ", Cn);
da2.SelectCommand.Parameters.AddWithValue("@prm", "%" + Slctd["Code"].ToString() + "%");

现在很好,谢谢大家。