【问题标题】:Specified cast is not valid. SQL Parameter指定的演员表无效。 SQL 参数
【发布时间】:2014-07-09 20:57:09
【问题描述】:

当使用参数运行查询时,我不断返回指定的强制转换在 int result = myDataReader.GetInt32(0); 行上无效。 问题是如果我用文本“WM07 OGR”替换@Reg,它就可以正常工作。但是字符串 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();

【问题讨论】:

  • 评论不是 100% 确定,但命令字符串中的 @Reg 参数周围是否需要 ''
  • 数据库中NO_ODOMETER_LAST的类型是什么?

标签: c# asp.net sql datareader oledbcommand


【解决方案1】:

试试这样的。

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

【讨论】:

    【解决方案2】:

    问题是,如果我将 @Reg 替换为文本“WM07 OGR”,它就可以正常工作。 但是字符串 reg 会返回这个,为什么会出错?

    如果由于没有匹配的TX_VEHNUMBER 而查询返回null,您似乎会收到错误,然后转换为int 失败。

    所以你必须检查它是否为空:

    int result = 0; // insert default
    if(!myDataReader.IsDbNull(0))
        result = myDataReader.GetInt32(0)
    

    除此之外它不起作用,因为您的参数被解释为值,您在此处将其包装在撇号中:

    WHERE (Vehicle.TX_VEHNUMBER = '@Reg')
    

    你只需要这样做:

    WHERE (Vehicle.TX_VEHNUMBER = @Reg)
    

    【讨论】:

    • !谢谢.. Arrrgg 该死的撇号让我.. 谢谢大家
    【解决方案3】:

    因为它进入了下面的块......

    if (myDataReader.Read())
            {
                int result = myDataReader.GetInt32(0);
                Prev_Mileage.Text = result.ToString();
            }
    

    ...我假设你有记录。我会检查NO_ODOMETER_LASTDataType,因为它可能是varcharint 以外的其他东西。如果是这种情况,您可能需要使用TryParse

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      相关资源
      最近更新 更多