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);
}
}
你确定你正在这条线上得到一个值吗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);
}
}