C# 在依赖组合框之间传递值

本文关键字:之间 依赖 组合 | 更新日期: 2023-09-27 18:32:13

我是相对较新的,但我已经研究了这个问题 2 天多,所以我想我已经做了尽职调查......但是,如果在我道歉之前已经回答了这个问题。 我的基本问题是我正在尝试创建一些依赖的组合框。 皱纹是显示的值通常不是下一个查询/组合框的查找值(我使用的是符合OLEDB的数据库) 例如:Table1 (T1) 包含 ID (int) 和 NM(字符串),Table2 (T2) 包含 ID (int) 和 STATUS(字符串)。 我运行查询 1 (Q1) 来显示 T1。Combobox1 (CB1) 中的 NM,当选择时,我运行 Query1a 来查找/获取要传递给填充 Combobox2 的 Query2 的所选 Table1.ID。 连接字符串和Q1工作正常,CB1显示正常,但是一旦我选择此错误,就会抛出此错误: "OleDbException ..SQL 直通表达式 ...使用 equals (=) 具有不同数据类型的组件"

//** 初始连接并填充 CB1 - 这工作正常 **

public void comboboxLoad()
      {
            string conn3str = <Connection String >;
            string query1 = "select NM from Table1 where REFVALUE=1 ; ";
            OleDbConnection conn3 = new OleDbConnection(conn3str);
            OleDbCommand tblRow1 = new OleDbCommand(query1, conn3);
            OleDbDataReader rdRow1;
            try
            {
                conn3.Open();
                lblConnState.Text = "Connection Successful";
                rdRow1 = tblRow1.ExecuteReader();
                while (rdRow1.Read())
                {
                    int colindx1 = rdRow1.GetOrdinal("NM");
                    string sItbl = rdRow1.GetString(colindx1);
                    CB1.Items.Add(sItbl);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error  " + ex);
            }
        }

从 CB1 获取值,创建查询以填充 CB2 **

private void CB1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string conn3str = <Connection String >;
            OleDbConnection conn3 = new OleDbConnection(conn3str); 
            conn3.Open();
            // Pass the selected value from CB1 (string) equal to Table1.NM (string)           
            string query1a = "select ID from Table1 where NM = '" + CB1.Text + "' ; ";
            OleDbCommand TabID = new OleDbCommand(query1a, conn3);
            int TabId2 = Convert.ToInt32(TabID.ExecuteScalar());
            // Pass the variable TabId2 (int) equal to Table2.ID (int)                       
            string query2 = "select STATUS from Table2 where ID = '" + TabId2 + "'; ";
            OleDbCommand tblRow2 = new OleDbCommand(query2, conn3);
            // OleDbDataReader rdTabID;
            // OleDbDataReader rdRow2;
            try
            {
                OleDbDataReader rdRow2 = TabID.ExecuteReader();
                OleDbDataReader rdTabID = tblRow2.ExecuteReader(); // ** Error points to this line **
                while (rdRow2.Read())
                {
                    int TabIdidx = rdTabID.GetOrdinal("ID");
                    string TabIDVal = rdTabID.GetString(TabIdidx);
// Pass reference ID to label on form
                    lblBTableID.Text = TabId2.ToString();
                    int colindx1 = rdRow2.GetOrdinal("STATUS"); 
                    string sIntVal = rdRow2.GetString(colindx1);
                    cmbLowLvl.Items.Add(sIntVal);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error  " + ex);
            }
        }

C# 在依赖组合框之间传递值

你确定你正在这条线上得到一个值吗int TabId2 = Convert.ToInt32(TabID.ExecuteScalar());

Convert.ToInt32不会像int.Parse那样抛出ArgumentNullException,因此变量可能没有被设置。

此外,出于安全目的,您可能还需要考虑将查询更改为使用参数化 SQL,而不是串联。https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters(v=vs.110).aspx

我已经能够找出问题所在。 我真的不确定为什么它最初不起作用,但我认为这是读者不匹配,因为我只是从查询中寻找一个值 ExecuteScalar() 似乎可以解决问题,我不需要"while"循环。 工作代码如下。 接下来,我需要在下一个查询中传递此返回值 (ID) 以填充 CB2。 谢谢@

private void CB1_SelectedIndexChanged(object sender, EventArgs e)
    {
        string conn3str = <Connection String >;
        OleDbConnection conn3 = new OleDbConnection(conn3str); 

        // Pass the selected value from CB1 (string) equal to Table1.NM (string) but return the int ID.
    OleDbCommand tblRow2 = new OleDbCommand("select ID from Table1 where NM=  '"+ CB1.Text +"' ;" , conn3);
    try
        {
        conn3.Open();
                string r2 = Convert.ToString(tblRow2.ExecuteScalar());
                MessageBox.Show(r2);
                lblBTableID.Text = "ID Code= " + r2;
                conn3.Close();
    }
        catch (Exception ex)
        {
            MessageBox.Show("Error  " + ex);
        }
    }