我比较新,但我已经研究了这个问题超过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);
}
}
答案 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);
}
}