当使用参数运行查询时,我继续回到指定的强制转换在int result = myDataReader.GetInt32(0);
行无效。
问题是如果我将@Reg替换为文本' WM07 OGR'它工作正常。但是字符串reg返回这个,为什么错误?
string reg = RadComboBox1.SelectedValue;
//prepare sql statements
Command = new OleDbCommand(@"SELECT MAX(Fuel.NO_ODOMETER_LAST) AS PrevMiles
FROM (Fuel INNER JOIN Vehicle ON Fuel.TX_VIN = Vehicle.TX_VIN)
WHERE (Vehicle.TX_VEHNUMBER = '@Reg')", conn);
Command.Parameters.AddWithValue("@Reg", OleDbType.WChar);
Command.Parameters["@Reg"].Value = reg;
myDataReader = Command.ExecuteReader();
if (myDataReader.Read())
{
int result = myDataReader.GetInt32(0);
Prev_Mileage.Text = result.ToString();
}
//cleanup objects
myDataReader.Close();
conn.Close();
答案 0 :(得分:0)
尝试这样的事情。
Command = new OleDbCommand(@"SELECT MAX(Fuel.NO_ODOMETER_LAST) AS PrevMiles
FROM (Fuel INNER JOIN Vehicle ON Fuel.TX_VIN = Vehicle.TX_VIN)
WHERE (Vehicle.TX_VEHNUMBER = @Reg)", conn);
或者
Command = new OleDbCommand(@"SELECT MAX(Fuel.NO_ODOMETER_LAST) AS PrevMiles
FROM (Fuel INNER JOIN Vehicle ON Fuel.TX_VIN = Vehicle.TX_VIN)
WHERE (Vehicle.TX_VEHNUMBER = '?')", conn);
或
Command = new OleDbCommand(@"SELECT MAX(Fuel.NO_ODOMETER_LAST) AS PrevMiles
FROM (Fuel INNER JOIN Vehicle ON Fuel.TX_VIN = Vehicle.TX_VIN)
WHERE (Vehicle.TX_VEHNUMBER = ?)", conn);
有关更多参考,请参阅以下链接。
http://www.java2s.com/Code/CSharp/Database-ADO.net/PassparametertoOleDbCommand.htm
答案 1 :(得分:0)
问题是如果我用文本'WM07 OGR'替换@Reg它可以正常工作。 但是字符串reg返回这个,为什么错误?
如果查询返回null,似乎您收到错误,因为没有匹配的TX_VEHNUMBER
,那么转换为int
会失败。
所以你必须检查它是否为空:
int result = 0; // insert default
if(!myDataReader.IsDbNull(0))
result = myDataReader.GetInt32(0)
除此之外它不起作用,因为你的参数被解释为值,你把它包装在这里的撇号中:
WHERE (Vehicle.TX_VEHNUMBER = '@Reg')
你必须这样做:
WHERE (Vehicle.TX_VEHNUMBER = @Reg)
答案 2 :(得分:0)
因为它进入下面的区块......
if (myDataReader.Read())
{
int result = myDataReader.GetInt32(0);
Prev_Mileage.Text = result.ToString();
}
...我猜你有记录。我会检查NO_ODOMETER_LAST
的数据类型,因为它可能是varchar
或int
以外的其他内容。如果是这种情况,您可能需要使用TryParse
。