我有几个从属组合框(CB)从不同的表中提取数据。它可以是选定值或查找值。例如,我将在框中显示文本(Name),选中后,我需要查找相应的int(ID)并在查询中使用该值来填充下一个组合框。
我在引用命令/查询结果和获取数据类型错误时遇到问题。错误是:
SQL passthru表达式...使用equals(=)具有不同数据类型的组件。
注意:我的oledb界面不支持ICommandWithParameters
// Get the ID (int) value - This works as I can convert the return value to a string and echo back to the screen
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);
labelTableID.Text = "ID Code= " + r2;
conn3.Close();
}
catch (Exception ex2)
{
MessageBox.Show("Error " + ex2);
}
// Pass the ID (int) value and populate the next combo box CB2
// This doesn't work and throws the data type mismatch error
OleDbCommand tblRow3 = new OleDbCommand("select STATUS from Table2 where TABLE_ID = '"+ tblRow2 +"'; ",conn3);
OleDbDataReader rdRow3;
try
{
conn3.Open();
rdRow3 = tblRow3.ExecuteReader();
while (rdRow3.Read())
{
CB2.Items.Add(rdRow3.GetString(0));
}
conn3.Close();
}
答案 0 :(得分:1)
你用撇号围绕你的数字,所以它被视为字符串文字。
删除撇号。
var tblRow3 =
new OleDbCommand("select STATUS from Table2 where TABLE_ID = " + tblRow2 + ";", conn3);
更好的是,parameterize您的查询,这样您就不会遇到这样的错误。
这是未经测试的,但这样的事情应该有效。您也可以指定参数的名称,但我不认为该名称与OLED的订单一样重要。
using (var cmd = new OleDbCommand("select STATUS from Table2 where TABLE_ID = ?", conn3))
{
cmd.Parameters.Add(new OleDbParameter {OleDbType = OleDbType.Integer, Value = tblRow2});
}
答案 1 :(得分:0)
我已经回答了我的大多数问题,而且我还有一个逻辑错误,即我的SQL查询在应该没有任何结果时也没有。我再次对C#很陌生,所以我可能没有正确的命名法,但这是我对问题/解决方案的理解。 OleDbCommand返回一个'对象',查询可以返回多行&列,但我需要在后续查询中进行比较的奇异值...因此ExecuteScalar()可以解决这个问题。一旦我有了一个好的值,我只需要将它转换为变量(string或int)并在下一个查询中正确嵌入。所以一切都在“工作”。 (没有错误),我已经验证了每个查询的结果,所以我知道它们是正确的...但是我没有从最后一个命令/查询(tblRow3a)获得任何结果。有任何想法吗?谢谢@
MessageBox.Show(CB1.Text);
string conn3str = <connection string>;
OleDbConnection conn3 = new OleDbConnection(conn3str);
// Get the ID (int) value
OleDbCommand tblRow2 = new OleDbCommand();
tblRow2.Connection = conn3;
tblRow2.CommandText = "select ID from Table1 where NM= ' " + CB1.Text +" ' ;" ;
conn3.Open();
// Convert & Pass the command result (tblRow2) to string (info only) & int (for next query)
string r2 = Convert.ToString(tblRow2.ExecuteScalar());
Label_1.Text = "ID Code= " + r2;
int r2i = Convert.ToInt32(tblRow2.ExecuteScalar());
// Select STATUS (string) where TABLE_ID (int) = ID (int)
OleDbCommand tblRow3 = new OleDbCommand();
tblRow3.Connection = conn3;
tblRow3.CommandText = "select STATUS from Table2 where TABLE_ID = " + r2i;
// Convert and Pass command result (tblRow3) to string for next query
// Where CODE (string) = r3 (string)
string r3 = Convert.ToString(tblRow3.ExecuteScalar());
Label_2.Text = "Current Status = " + r3;
OleDbCommand tblRow3a = new OleDbCommand();
tblRow3a.Connection = conn3;
tblRow3a.CommandText = "select ORDER from Table3 where CODE = ' " + r3 + " ' ;" ;
string r3a = Convert.ToString(tblRow3a.ExecuteScalar());
lblInvCd.Text = "Order = " + r3a;
MessageBox.Show(r3a);
// Result is empty even through this same query returns results in the database
答案 2 :(得分:0)
我发现了问题,它实际上没什么,即空格。 坏:'“+ var +”'好:'“+ var +”'所有查询现在都正常工作。