指定演员表无效。 SQL参数

时间:2014-05-21 09:39:06

标签: c# asp.net sql datareader oledbcommand

当使用参数运行查询时,我继续回到指定的强制转换在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();

3 个答案:

答案 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

http://blogs.msdn.com/b/wriju/archive/2008/01/24/ado-net-oledbcommand-parameterized-query-sequence-rule.aspx

答案 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数据类型,因为它可能是varcharint以外的其他内容。如果是这种情况,您可能需要使用TryParse