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

时间:2016-01-27 18:26:19

标签: c# combobox oledb

我比较新,但我已经研究了这个问题超过2天了,所以我想我已经完成了尽职调查......但是如果在我道歉之前已经回答了这个问题。   我的基本问题是我正在尝试创建一些依赖的组合框。皱纹是显示的值通常不是下一个查询/组合框的查找值(我使用的是OLEDB兼容的数据库)   例如:Table1(T1)包含ID(int)& NM(字符串),表2(T2)包含ID(int)&状态(字符串)。我运行Query1(Q1)在Combobox1(CB1)中显示T1.NM,选中后我运行Query1a查找/获取所选的Table1.ID以传递给填充Combobox2的Query2。连接字符串和Q1工作正常,CB1显示正常,但一旦我选择此错误被抛出:   “OleDbException .. SQL Passthru表达式...使用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);
            }
        }

2 个答案:

答案 0 :(得分:0)

你是否肯定你在这一行int TabId2 = Convert.ToInt32(TabID.ExecuteScalar());上获得了价值?

Convert.ToInt32并不会像ArgumentNullException那样抛出int.Parse,因此可能无法设置变量。

另外,为了安全起见,您可能需要考虑更改查询以使用参数化SQL而不是连接。 https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters(v=vs.110).aspx

答案 1 :(得分:0)

我已经能够找出问题所在。我真的不确定为什么它最初没有工作,但我认为这是一个读者不匹配,因为我只是从查询中寻找单个值ExecuteScalar()似乎可以解决问题而我并不需要&#39;而#39;环。工作代码如下。   接下来,我需要在下一个查询中传递此返回值(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);
        }
    }