Указанный состав недействителен. Параметр SQL

1

Я продолжаю возвращать указанный int result = myDataReader.GetInt32(0); недействителен на 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();
Теги:
datareader
oledbcommand

3 ответа

0
Лучший ответ

Дело в том, что если я заменю @Reg текстом WM07 OGR, он отлично работает. Однако строка reg возвращает это так, почему ошибка?

Кажется, что вы получаете ошибку, если запрос возвращает null, потому что нет соответствующего TX_VEHNUMBER, после чего TX_VEHNUMBER в int.

Поэтому вам нужно проверить, не имеет ли значение null:

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

Кроме того, это не работает, потому что ваш параметр интерпретируется как значение, вы заключили его в апострофы здесь:

WHERE (Vehicle.TX_VEHNUMBER = '@Reg')

Вам просто нужно сделать это:

WHERE (Vehicle.TX_VEHNUMBER = @Reg)
  • 0
    ! Спасибо .. Arrrgg, чертовы апострофы достали меня .. Спасибо всем
0

Поскольку он попадает в нижний блок...

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

Я полагаю, у вас есть запись. Я бы проверил DataType NO_ODOMETER_LAST, так как это может быть varchar или что-то другое, кроме int. Если это случай, возможно, вам придется использовать TryParse.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню